Merge "Attachments now show in a grid-like view." into jb-ub-mail
diff --git a/res/color-sw600dp/folder_name_color_primary_invertible.xml b/res/color-sw600dp/folder_name_color_primary_invertible.xml
index 9f57209..18367c7 100644
--- a/res/color-sw600dp/folder_name_color_primary_invertible.xml
+++ b/res/color-sw600dp/folder_name_color_primary_invertible.xml
@@ -19,6 +19,8 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_enabled="false"
         android:color="#ff999999"/>
+    <item android:state_checked="true"
+        android:color="@android:color/white" />
     <item android:state_activated="true"
         android:color="@android:color/white" />
     <item
diff --git a/res/color/folder_name_color_primary_invertible.xml b/res/color/folder_name_color_primary_invertible.xml
index 96172af..81e0e73 100644
--- a/res/color/folder_name_color_primary_invertible.xml
+++ b/res/color/folder_name_color_primary_invertible.xml
@@ -20,9 +20,9 @@
     <item android:state_enabled="false"
         android:color="#ff999999"/>
     <item android:state_checked="true"
-        android:color="@android:color/black" />
-    <item android:state_activated="true"
         android:color="@android:color/white" />
+    <item android:state_activated="true"
+        android:color="@android:color/black" />
     <item
         android:color="@android:color/black" />
 </selector>
diff --git a/res/drawable-sw600dp/widget_conversation_read_selector.xml b/res/drawable-sw600dp/widget_conversation_read_selector.xml
new file mode 100644
index 0000000..5302741
--- /dev/null
+++ b/res/drawable-sw600dp/widget_conversation_read_selector.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true"
+          android:drawable="@drawable/list_conversation_wide_read_focused_holo" />
+    <item android:state_activated="true"
+          android:drawable="@drawable/list_conversation_wide_read_pressed_holo" />
+    <item android:state_pressed="true"
+          android:drawable="@drawable/list_conversation_wide_read_pressed_holo" />
+    <item android:state_selected="true"
+          android:drawable="@drawable/list_conversation_wide_read_selected_holo" />
+    <item android:state_selected="true"
+          android:state_activated="true"
+          android:drawable="@drawable/list_conversation_wide_read_selected_holo" />
+    <item android:drawable="@drawable/list_conversation_wide_read_normal_holo" />
+</selector>
diff --git a/res/drawable-sw600dp/widget_conversation_unread_selector.xml b/res/drawable-sw600dp/widget_conversation_unread_selector.xml
new file mode 100644
index 0000000..179a398
--- /dev/null
+++ b/res/drawable-sw600dp/widget_conversation_unread_selector.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true"
+          android:drawable="@drawable/list_conversation_wide_unread_focused_holo" />
+    <item android:state_activated="true"
+          android:drawable="@drawable/list_conversation_wide_unread_pressed_holo" />
+    <item android:state_pressed="true"
+          android:drawable="@drawable/list_conversation_wide_unread_pressed_holo" />
+    <item android:state_selected="true"
+          android:drawable="@drawable/list_conversation_wide_unread_selected_holo" />
+    <item android:state_selected="true"
+          android:state_activated="true"
+          android:drawable="@drawable/list_conversation_wide_unread_selected_holo" />
+    <item android:drawable="@drawable/list_conversation_wide_unread_normal_holo" />
+</selector>
\ No newline at end of file
diff --git a/res/layout/folder_item.xml b/res/layout/folder_item.xml
index 4958b48..09a6f15 100644
--- a/res/layout/folder_item.xml
+++ b/res/layout/folder_item.xml
@@ -45,7 +45,7 @@
         android:layout_alignWithParentIfMissing="true"
         android:layout_alignParentRight="true"
         android:layout_toLeftOf="@id/folder_parent_icon"
-        android:textColor="@color/text_color_unread_invertible" />
+        android:textColor="@color/folder_name_color_primary_invertible" />
 
     <RelativeLayout
         android:layout_width="match_parent"
@@ -70,7 +70,7 @@
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
             android:layout_below="@id/name"
-            android:textColor="@color/text_color_primary_invertible"
+            android:textColor="@color/folder_name_color_primary_invertible"
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:visibility="gone" />
 
diff --git a/res/raw/template_conversation_upper.html b/res/raw/template_conversation_upper.html
index b4abb38..1beb249 100644
--- a/res/raw/template_conversation_upper.html
+++ b/res/raw/template_conversation_upper.html
@@ -13,5 +13,4 @@
   </style>
 </head>
 <body style="margin: 0;">
-<!-- TODO: promote this to a spacer so its overlay can scroll like the other adapter views -->
 <div id="conversation-header" style="height: %spx;"></div>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index dfedca5..78a9d7e 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"لم يتم تعيين هذا الحساب على المزامنة تلقائيًا."\n"يمكنك لمس "<b>"المزامنة الآن"</b>" لمزامنة البريد مرة واحدة أو "<b>"تغيير إعدادات المزامنة"</b>" لإعداد هذا الحساب على مزامنة البريد تلقائيًا."</string>
     <string name="manual_sync" msgid="6743983544685622800">"مزامنة الآن"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"تغيير إعدادات المزامنة"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"صور من الرسالة"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"تعذر تحميل الصورة."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"الفيديو ليس متوفرًا في الوقت الحالي. يرجى التحديث."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"العنصر ليس متوفرًا في الوقت الحالي. يرجى التحديث."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"الصورة ليست متاحة حاليًا."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"جارٍ التحميل…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"جارٍ الإرسال…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"هذه الصورة كبيرة جدًا ولا يمكن تنزيلها، فهل تريد إعادة المحاولة باستخدام درجة دقة أقل؟"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"تعذر حفظ الصورة في الجهاز."</string>
+    <string name="yes" msgid="7474216525286833848">"نعم"</string>
+    <string name="no" msgid="427548507197604096">"لا"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"يتعذر العثور على الصورة."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> من <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" المزيد »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"للتو"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> دقيقة"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> دقائق"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> ساعة"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> ساعات"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> يوم"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> أيام"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"جارٍ إدراج الصورة..."</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index e4f1882..f3f1b3e 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -331,6 +331,5 @@
     <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> days"</item>
   </plurals>
     <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Inserting photo…"</string>
-    <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
-    <skip />
+    <string name="cant_move_or_change_labels" msgid="7997792014816166601">"Can\'t move because selection contains multiple accounts."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index dc34d37..bc88a31 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Esta cuenta no está configurada para sincronizar el correo automáticamente."\n"Toca "<b>"Sincronizar ahora"</b>" para sincronizar el correo una vez o "<b>"Cambiar la configuración de sincronización"</b>" para que esta cuenta sincronice el correo automáticamente."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sincr. ahora"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Cambiar conf. de sinc."</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Fotos del mensaje"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"No se pudo cargar la foto."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Video no disponible en este momento. Actualiza la página."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Elemento no disponible. Actualiza la página."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"La foto no está disponible en este momento."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Cargando..."</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Enviando..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Esta imagen es demasiado grande para descargarla, ¿quieres descargarla con una resolución menor?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"No se pudo guardar la foto en el dispositivo."</string>
+    <string name="yes" msgid="7474216525286833848">"Sí"</string>
+    <string name="no" msgid="427548507197604096">"No"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"No se encontró la foto."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> de <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Ver más »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Ahora"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> minuto"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> hora"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> día"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> días"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Insertando foto…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 77aa5b3..326acf6 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"See konto ei ole seadistatud automaatseks sünkroonimiseks."\n"Puudutage käsku "<b>"Sünkrooni kohe"</b>", et meile üks kord sünkroonida, või käsku "<b>"Muuda sünkroonimisseadeid"</b>", et seadistada see konto meilide automaatseks sünkroonimiseks."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sünkr. kohe"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Muuda sünkroonimisseadeid"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Fotod sõnumist"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Fotot ei saanud laadida."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Video pole praegu saadaval. Värskendage."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Üksus pole praegu saadaval. Värskendage."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Foto pole praegu saadaval."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Laadimine …"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Saatmine ..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"See kujutis on allalaadimiseks liiga suur. Kas soovite proovida laadida seda alla väiksema eraldusvõimega?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Fotot ei saanud seadmesse salvestada."</string>
+    <string name="yes" msgid="7474216525286833848">"Jah"</string>
+    <string name="no" msgid="427548507197604096">"Ei"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Fotot ei leitud."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g>/<xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Kuva rohkem »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Äsja"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> minut tagasi"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> minutit tagasi"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> tund tagasi"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> tundi tagasi"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> päev tagasi"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> päeva tagasi"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Foto sisestamine …"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 25e6202..53b418c 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"این حساب برای همگام‌سازی به طور خودکار تنظیم نشده است."\n"برای یکبار همگام‌سازی نامه، "<b>"اکنون همگام‌سازی شود"</b>" را لمس کنید، یا برای تنظیم این حساب برای همگام‌سازی نامه به طور خودکار، "<b>"تنظیمات همگام‌سازی را تغییر دهید"</b>"."</string>
     <string name="manual_sync" msgid="6743983544685622800">"اکنون همگام‌سازی شود"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"تغییر تنظیمات همگام‌سازی"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"عکس از پیام"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"عکس بارگیری نشد."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"ویدیو در حال حاضر موجود نیست. لطفاً بازخوانی کنید."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"این مورد در حال حاضر در دسترس نیست. لطفا بازخوانی کنید."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"عکس در حال حاضر موجود نیست."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"درحال بارگیری..."</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"درحال ارسال ..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"این تصویر برای دانلود خیلی بزرگ است، آیا می‌خواهید با وضوح کمتر دوباره امتحان کنید؟"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"ذخیره عکس در دستگاه امکانپذیر نیست."</string>
+    <string name="yes" msgid="7474216525286833848">"بله"</string>
+    <string name="no" msgid="427548507197604096">"خیر"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"عکس یافت نمی‌شود."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> از <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" مشاهده موارد بیشتر »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"هم اکنون"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> دقیقه"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> دقیقه"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> ساعت"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> ساعت"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> روز"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> روز"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"در حال درج عکس…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 860d6fd..1ec03e4 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Akun ini tidak disiapkan untuk menyinkronkan secara otomatis."\n"Sentuh "<b>"Sinkronkan Sekarang"</b>" untuk menyinkronkan surat, atau "<b>"Ubah Setelan Sinkronisasi"</b>" untuk menyiapkan akun ini untuk sinkronisasi secara otomatis."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sinkron skrg"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Ubah setelan sinkronisasi"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Foto dari pesan"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Foto tidak dapat dimuat."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Video tidak tersedia saat ini. Segarkan."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Item tidak tersedia saat ini. Segarkan."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Foto tidak tersedia saat ini."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Memuat..."</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Mengirim..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Gambar terlalu besar untuk diunduh. Ingin mencoba lagi dengan resolusi yang lebih kecil?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Foto tidak dapat disimpan ke perangkat."</string>
+    <string name="yes" msgid="7474216525286833848">"Ya"</string>
+    <string name="no" msgid="427548507197604096">"Tidak"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Tidak dapat menemukan foto."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> dari <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Lihat lainnya »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Baru saja"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> mnt"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> mnt"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> jam"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> jam"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> hari"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> hari"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Menyisipkan foto…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8a81614..135faaa 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -342,6 +342,5 @@
     <!-- no translation found for num_days_ago:other (2756574969735638578) -->
     <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
     <skip />
-    <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
-    <skip />
+    <string name="cant_move_or_change_labels" msgid="7997792014816166601">"Impossibile spostare i messaggi perché la selezione contiene più account."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 24e6a18..fccedaf 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"이 계정은 자동으로 동기화되도록 설정되지 않았습니다."\n<b>"지금 동기화"</b>"를 터치하여 메일을 한 번 동기화하거나 "<b>"동기화 설정 변경"</b>"을 터치하여 이 계정이 메일을 자동으로 동기화하도록 설정하세요."</string>
     <string name="manual_sync" msgid="6743983544685622800">"지금 동기화"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"동기화 설정 변경"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"메일의 사진"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"사진을 로드하지 못했습니다."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"현재 동영상을 볼 수 없습니다. 새로고침하세요."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"현재 사용할 수 없는 항목입니다. 새로고침하세요."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"지금은 사진을 사용할 수 없습니다."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"로드 중…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"전송 중…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"이 이미지는 다운로드하기에 너무 큽니다. 더 낮은 해상도로 다시 시도하시겠습니까?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"사진을 기기에 저장하지 못했습니다."</string>
+    <string name="yes" msgid="7474216525286833848">"예"</string>
+    <string name="no" msgid="427548507197604096">"아니요"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"사진을 찾을 수 없음"</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="COUNT">%d</xliff:g>장 중 <xliff:g id="CURRENT_POS">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">"더보기 »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"방금 전"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g>분"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g>분"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g>시간"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g>시간"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g>일"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g>일"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"사진 추가 중…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3019daf..fe0efb7 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Ši paskyra nenustatyta automatiškai sinchronizuoti."\n"Jei norite vieną kartą sinchronizuoti paštą, palieskite "<b>"Sinch. dabar"</b>" arba palieskite "<b>"Keisti sinchronizavimo nustat."</b>", kad nustatytumėte šią paskyrą automatiškai sinchronizuoti paštą."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sinch. dabar"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Keisti sinchronizavimo nustat."</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Nuotraukos iš pranešimo"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Nepavyko įkelti nuotraukos."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Šiuo metu vaizdo įrašas nepasiekiamas. Atnaujinkite."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Šiuo metu elementas nepasiekiamas. Atnaujinkite."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Šiuo metu nuotrauka nepasiekiama."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Įkeliama…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Siunčiama…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Norimas atsisiųsti vaizdas per didelis. Ar norėtumėte pabandyti nustatę mažesnę skyrą?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Nepavyko išsaugoti nuotraukos įrenginyje."</string>
+    <string name="yes" msgid="7474216525286833848">"Taip"</string>
+    <string name="no" msgid="427548507197604096">"Ne"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Nepavyksta rasti nuotraukos."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> iš <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Žr. daugiau »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Ką tik"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> min."</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> min."</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> val."</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> val."</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> d."</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> d."</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Įterpiama nuotrauka…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index c6162a5..c59cc36 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Šajā kontā nav iestatīta automātiskā sinhronizācija."\n"Pieskarieties vienumam "<b>"Sinhronizēt tūlīt"</b>", lai vienreiz sinhronizētu pastu, vai vienumam "<b>"Mainīt sinhronizācijas iestatījumus"</b>", lai šajā kontā iestatītu automātisku pasta sinhronizāciju."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sinhr. tūlīt"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Mainīt sinhronizācijas iestat."</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Fotoattēli no ziņojuma"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Fotoattēlu nevarēja ielādēt."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Videoklips pašlaik nav pieejams. Lūdzu, atsvaidziniet."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Vien. pašlaik nav pieejams. Lūdzu, atsvaidziniet."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Fotoattēls pašlaik nav pieejams."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Notiek ielāde…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Notiek sūtīšana..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Šis attēls ir pārāk liels, lai to lejupielādētu. Vai vēlaties izmantot mazākas izšķirtspējas attēlu?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Fotoattēlu nevarēja saglabāt ierīcē."</string>
+    <string name="yes" msgid="7474216525286833848">"Jā"</string>
+    <string name="no" msgid="427548507197604096">"Nē"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Nevar atrast fotoattēlu."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g>. no <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Skatīt vairāk »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Tikko"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"pirms <xliff:g id="COUNT">%d</xliff:g> minūtes"</item>
+    <item quantity="other" msgid="4976118461634588647">"pirms <xliff:g id="COUNT">%d</xliff:g> minūtēm"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"pirms <xliff:g id="COUNT">%d</xliff:g> stundas"</item>
+    <item quantity="other" msgid="1470820825143524326">"pirms <xliff:g id="COUNT">%d</xliff:g> stundām"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"pirms <xliff:g id="COUNT">%d</xliff:g> dienas"</item>
+    <item quantity="other" msgid="2756574969735638578">"pirms <xliff:g id="COUNT">%d</xliff:g> dienām"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Notiek fotoattēla ievietošana…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index aa86262..5a3a8cb 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Akaun ini tidak ditetapkan untuk disegerakkan secara automatik."\n"Sentuh "<b>"Segerakkan Sekarang"</b>" untuk menyegerakkan e-mel sekali, atau "<b>"Tukar Tetapan Penyegerakan"</b>" untuk menyediakan akaun ini agar menyegerakkan e-mel secara automatik."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Segerakkan sekarang"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Tukar tetapan penyegerakan"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Foto dari mesej"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Foto tidak dapat dimuatkan."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Video tidak tersedia pada masa ini. Sila muat semula."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Item tidak tersedia pada masa ini. Sila muat semula."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Foto tidak tersedia sekarang."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Memuatkan…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Menghantar…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Imej ini terlalu besar untuk dimuat turun, adakah anda mahu mencuba semula pada resolusi yang lebih kecil?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Foto tidak dapat disimpan ke peranti."</string>
+    <string name="yes" msgid="7474216525286833848">"Ya"</string>
+    <string name="no" msgid="427548507197604096">"Tiada"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Tidak menjumpai foto."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> daripada <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Lihat lagi »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Sebentar tadi"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> mins"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> jam"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> jam"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> hari"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> hari"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Menyisipkan foto..."</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 4ca1fec..85d29dd 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Konto nie jest skonfigurowane do automatycznej synchronizacji."\n"Kliknij "<b>"Synchronizuj"</b>", by zsynchronizować pocztę jeden raz, lub "<b>"Zmień ustawienia synchronizacji"</b>", by skonfigurować konto do automatycznej synchronizacji wiadomości."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Synchronizuj"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Zmień ustawienia synchronizacji"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Zdjęcia z wiadomości"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Nie można wczytać zdjęcia."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Film jest teraz niedostępny. Odśwież stronę."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Element jest teraz niedostępny. Odśwież stronę."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Zdjęcie jest teraz niedostępne."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Wczytuję…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Wysyłam…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Obraz jest za duży, by go pobrać. Chcesz spróbować po zmniejszeniu rozdzielczości?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Nie można zapisać zdjęcia na urządzeniu."</string>
+    <string name="yes" msgid="7474216525286833848">"Tak"</string>
+    <string name="no" msgid="427548507197604096">"Nie"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Nie można znaleźć zdjęcia."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> z <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Zobacz więcej »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Teraz"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> godz."</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> godz."</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> dzień"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> dni"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Wstawiam zdjęcie…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 85cb04b..f34f402 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Esta conta não está configurada para sincronizar automaticamente."\n"Toque em "<b>"Sincronizar agora"</b>" para sincronizar os e-mails uma vez ou em "<b>"Alterar configurações de sincronização"</b>" para configurar a sincronização automática de e-mails desta conta."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Sincr. agora"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Alterar config. de sincr."</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Fotos de mensagem"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Não foi possível carregar a foto."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"O vídeo não está disponível no momento. Atualize."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"O item não está disponível no momento. Atualize."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"A foto não está disponível no momento."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Carregando..."</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Enviando..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Esta imagem é grande demais para fazer o download. Deseja tentar novamente com uma resolução menor?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Não foi possível salvar a foto no dispositivo."</string>
+    <string name="yes" msgid="7474216525286833848">"Sim"</string>
+    <string name="no" msgid="427548507197604096">"Não"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Não é possível encontrar a foto."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> de <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Ver mais »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Agora"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> hora"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> dia"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Inserindo foto..."</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f991fda..2922952 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Hindi naka-set up ang account na ito upang awtomatikong mag-sync."\n"Pindutin ang "<b>"I-sync Ngayon"</b>" upang i-sync ang mail nang isang beses, o "<b>"Baguhin ang Mga Setting ng Pag-sync"</b>" upang i-set up ang account na ito upang awtomatikong i-sync ang mail."</string>
     <string name="manual_sync" msgid="6743983544685622800">"I-sync na"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Baguhin mga setting ng sync"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Mga larawan mula sa mensahe"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Hindi ma-load ang larawan."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Hindi available ang video ngayon. Mangyaring mag-refresh."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Di available item ngayon. Mangyaring mag-refresh."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Hindi available ang larawan ngayon."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Naglo-load..."</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Ipinapadala..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Masyadong malaki ang larawang ito upang i-download, gusto mo bang muling subukan sa mas maliit na resolusyon?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Hindi ma-save ang larawan sa device."</string>
+    <string name="yes" msgid="7474216525286833848">"Oo"</string>
+    <string name="no" msgid="427548507197604096">"Hindi"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Hindi mahanap ang larawan."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> ng <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Makakita ng higit pa »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Ngayon lang"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> min"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> (na) min"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> oras"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> (na) oras"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> araw"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> (na) araw"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Ipinapasok ang larawan..."</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 1d97960..b7237f1 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Цей обліковий запис не налаштовано для автоматичної синхронізації."\n"Виберіть "<b>"Синхронізувати зараз"</b>", щоб синхронізувати пошту один раз, або "<b>"Змінити налаштування синхронізації"</b>", щоб налаштувати цей обліковий запис для автоматичної синхронізації пошти."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Синхр. зараз"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Змінити налашт. синхронізації"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Фотографії з повідомлення"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Не вдалося завантажити фотографію."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Відео зараз не доступне. Оновіть його."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Елемент зараз не доступний. Оновіть його."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Фотографія зараз не доступна."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Завантаження…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Надсилання…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Це зображення завелике для завантаження. Повторити спробу, зменшивши роздільну здатність?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Не вдалося зберегти фотографію на пристрій."</string>
+    <string name="yes" msgid="7474216525286833848">"Так"</string>
+    <string name="no" msgid="427548507197604096">"Ні"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Неможливо знайти фотографію."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> з <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Докладніше »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Щойно"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> хв."</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> хв."</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> год."</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> год."</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> дн."</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> дн."</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Вставлення фотографії…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4c60a7c..30467e4 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Tài khoản này không được thiết lập để tự động đồng bộ hóa."\n"Chạm vào "<b>"Đồng bộ hóa ngay bây giờ"</b>" để đồng bộ hóa thư một lần hoặc "<b>"Thay đổi cài đặt đồng bộ hóa"</b>" để thiết lập tài khoản này tự động đồng bộ hóa thư."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Đồng bộ hóa ngay bây giờ"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Thay đổi cài đặt đồng bộ hóa"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Ảnh từ thư"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Không thể tải ảnh."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Hiện tại, không có video nào. Vui lòng làm mới."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Hiện tại, không có mục nào. Vui lòng làm mới."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Ảnh không sẵn có ngay lúc này."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Đang tải…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Đang gửi…"</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Hình ảnh này quá lớn để tải xuống, bạn có muốn thử lại ở độ phân giải thấp hơn không?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Không thể lưu ảnh vào thiết bị."</string>
+    <string name="yes" msgid="7474216525286833848">"Có"</string>
+    <string name="no" msgid="427548507197604096">"Không"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Không thể tìm thấy ảnh."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> trong số <xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Xem thêm »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Vừa mới"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"<xliff:g id="COUNT">%d</xliff:g> phút"</item>
+    <item quantity="other" msgid="4976118461634588647">"<xliff:g id="COUNT">%d</xliff:g> phút"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"<xliff:g id="COUNT">%d</xliff:g> giờ"</item>
+    <item quantity="other" msgid="1470820825143524326">"<xliff:g id="COUNT">%d</xliff:g> giờ"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"<xliff:g id="COUNT">%d</xliff:g> ngày"</item>
+    <item quantity="other" msgid="2756574969735638578">"<xliff:g id="COUNT">%d</xliff:g> ngày"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Đang chèn ảnh…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index d39d508..f16497b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -52,7 +52,7 @@
     <string name="send" msgid="8242003661397555986">"傳送"</string>
     <string name="mark_read" msgid="8438349154394313195">"標示為已讀取"</string>
     <string name="mark_unread" msgid="6231373939351125713">"標示為未讀取"</string>
-    <string name="mute" msgid="1995954983688603977">"忽略"</string>
+    <string name="mute" msgid="1995954983688603977">"略過"</string>
     <string name="add_star" msgid="2866003744391266498">"加上星號"</string>
     <string name="remove_star" msgid="4372327933122106128">"移除星號"</string>
     <string name="archive" msgid="847250094775910499">"封存"</string>
@@ -175,8 +175,8 @@
     <item quantity="other" msgid="850868849811019745">"正在等待系統開始處理 <xliff:g id="COUNT">%1$d</xliff:g> 個會話群組。"</item>
   </plurals>
   <plurals name="conversation_muted">
-    <item quantity="one" msgid="3197365771487542615">"已忽略 &lt;b&gt;<xliff:g id="COUNT">%1$d</xliff:g>&lt;/b&gt; 個會話群組。"</item>
-    <item quantity="other" msgid="1941193356069303587">"已忽略 &lt;b&gt;<xliff:g id="COUNT">%1$d</xliff:g>&lt;/b&gt; 個會話群組。"</item>
+    <item quantity="one" msgid="3197365771487542615">"已略過 &lt;b&gt;<xliff:g id="COUNT">%1$d</xliff:g>&lt;/b&gt; 個會話群組。"</item>
+    <item quantity="other" msgid="1941193356069303587">"已略過 &lt;b&gt;<xliff:g id="COUNT">%1$d</xliff:g>&lt;/b&gt; 個會話群組。"</item>
   </plurals>
   <plurals name="conversation_spammed">
     <item quantity="one" msgid="3060864972122279220">"已將 &lt;b&gt;<xliff:g id="COUNT">%1$d</xliff:g>&lt;/b&gt; 個會話群組回報為垃圾郵件。"</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index de4db27..a3a3b1a 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -302,46 +302,35 @@
     <string name="wait_for_manual_sync_body" msgid="2003192935254244968">"Le akhawunti ayisethiwe kufika ekuvumelaniseni kokuzenzakalela."\n"Thinta u-"<b>"Vumelanisa manje"</b>" ukuze uvumelanise imeyila kanye, noma "<b>"shintsha izilungiselelo zokuvumelanisa"</b>" ukuze usethe le akhawunti ukuze ivumelanise imeyili ngokuzenzakalela."</string>
     <string name="manual_sync" msgid="6743983544685622800">"Vumelanisa manje"</string>
     <string name="change_sync_settings" msgid="5514293926214426577">"Shintsha izilungiselelo zokuvumelanisa"</string>
-    <!-- no translation found for photo_view_default_title (305616940993932174) -->
-    <skip />
-    <!-- no translation found for photo_view_load_error (1802859675974843136) -->
-    <skip />
-    <!-- no translation found for photo_view_video_not_ready (8488887700991406631) -->
-    <skip />
-    <!-- no translation found for photo_view_placeholder_image (465734985000555852) -->
-    <skip />
-    <!-- no translation found for photo_network_error (6545183306958652345) -->
-    <skip />
-    <!-- no translation found for loading_photo (6784297653634402137) -->
-    <skip />
-    <!-- no translation found for post_operation_pending (1312168212880219407) -->
-    <skip />
-    <!-- no translation found for download_photo_retry (1894223549069749239) -->
-    <skip />
-    <!-- no translation found for download_photo_error (7511376299526085797) -->
-    <skip />
-    <!-- no translation found for yes (7474216525286833848) -->
-    <skip />
-    <!-- no translation found for no (427548507197604096) -->
-    <skip />
-    <!-- no translation found for camera_photo_error (653424229752191252) -->
-    <skip />
-    <!-- no translation found for photo_view_count (1568865177363028519) -->
-    <skip />
-    <!-- no translation found for truncated_info (4901078975545890098) -->
-    <skip />
-    <!-- no translation found for truncated_info_see_more (2068973974507128729) -->
-    <skip />
-    <!-- no translation found for posted_just_now (7872790861965011674) -->
-    <skip />
-    <!-- no translation found for num_minutes_ago:one (4750191148321568233) -->
-    <!-- no translation found for num_minutes_ago:other (4976118461634588647) -->
-    <!-- no translation found for num_hours_ago:one (2178354472031148118) -->
-    <!-- no translation found for num_hours_ago:other (1470820825143524326) -->
-    <!-- no translation found for num_days_ago:one (5538890823169916595) -->
-    <!-- no translation found for num_days_ago:other (2756574969735638578) -->
-    <!-- no translation found for dialog_inserting_camera_photo (2711654208680211224) -->
-    <skip />
+    <string name="photo_view_default_title" msgid="305616940993932174">"Izithombe ezivela emlayezweni"</string>
+    <string name="photo_view_load_error" msgid="1802859675974843136">"Isithombe asikwazanga ukulayishwa."</string>
+    <string name="photo_view_video_not_ready" msgid="8488887700991406631">"Ividiyo ayitholakali ngalesi sikhathi. Sicela uqale kabusha."</string>
+    <string name="photo_view_placeholder_image" msgid="465734985000555852">"Into ayitholakali ngalesi sikhathi. Sicela uqale kabusha."</string>
+    <string name="photo_network_error" msgid="6545183306958652345">"Isithombe asitholakali okwamanje."</string>
+    <string name="loading_photo" msgid="6784297653634402137">"Iyalayisha…"</string>
+    <string name="post_operation_pending" msgid="1312168212880219407">"Iyathumela..."</string>
+    <string name="download_photo_retry" msgid="1894223549069749239">"Lesi sithombe sikhulu kakhulu ukuthi singalandwa, ingabe ungathanda ukuzama kabusha ngokulungiswa okuncane?"</string>
+    <string name="download_photo_error" msgid="7511376299526085797">"Isithombe asikwazanga ukulondolozwa kudivayisi."</string>
+    <string name="yes" msgid="7474216525286833848">"Yebo"</string>
+    <string name="no" msgid="427548507197604096">"Cha"</string>
+    <string name="camera_photo_error" msgid="653424229752191252">"Ayikwazi ukuthola isithombe."</string>
+    <string name="photo_view_count" msgid="1568865177363028519">"<xliff:g id="CURRENT_POS">%d</xliff:g> kwe-<xliff:g id="COUNT">%d</xliff:g>"</string>
+    <string name="truncated_info" msgid="4901078975545890098">"..."</string>
+    <string name="truncated_info_see_more" msgid="2068973974507128729">" Bona okungaphezulu »"</string>
+    <string name="posted_just_now" msgid="7872790861965011674">"Khona manje"</string>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="4750191148321568233">"Iminithi elingu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+    <item quantity="other" msgid="4976118461634588647">"Amaminithi angu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="2178354472031148118">"Ihora elingu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+    <item quantity="other" msgid="1470820825143524326">"Amahora angu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="5538890823169916595">"Usuku olungu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+    <item quantity="other" msgid="2756574969735638578">"Izinsuku ezingu-<xliff:g id="COUNT">%d</xliff:g>"</item>
+  </plurals>
+    <string name="dialog_inserting_camera_photo" msgid="2711654208680211224">"Ifaka isithombe…"</string>
     <!-- no translation found for cant_move_or_change_labels (7997792014816166601) -->
     <skip />
 </resources>
diff --git a/src/com/android/mail/browse/SelectedConversationsActionMenu.java b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
index 13fd7cb..cfcbb1a 100644
--- a/src/com/android/mail/browse/SelectedConversationsActionMenu.java
+++ b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
@@ -36,10 +36,10 @@
 import com.android.mail.providers.UIProvider;
 import com.android.mail.providers.UIProvider.ConversationColumns;
 import com.android.mail.providers.UIProvider.FolderCapabilities;
-import com.android.mail.ui.AbstractActivityController;
-import com.android.mail.ui.AnimatedAdapter;
+import com.android.mail.ui.ControllableActivity;
 import com.android.mail.ui.ConversationSelectionSet;
 import com.android.mail.ui.ConversationSetObserver;
+import com.android.mail.ui.ConversationUpdater;
 import com.android.mail.ui.DestructiveAction;
 import com.android.mail.ui.FoldersSelectionDialog;
 import com.android.mail.ui.RestrictedActivity;
@@ -74,61 +74,37 @@
     private final Context mContext;
 
     @VisibleForTesting
-    ActionMode mActionMode;
+    private ActionMode mActionMode;
 
     private boolean mActivated = false;
 
     private Menu mMenu;
 
-    private AnimatedAdapter mListAdapter;
-    // TODO(viki): Bad idea.  This is a relic of the previous method of having a DestructiveAction.
-    // A better implementation is not to have clients know about destructive actions but rather
-    // request them from the controller directly. Then, you wouldn't need to know when to commit
-    // them.
-    private AbstractActivityController mController;
+    /** Object that can update conversation state on our behalf. */
+    private final ConversationUpdater mUpdater;
 
-    private Account mAccount;
+    private final Account mAccount;
 
-    protected int mCheckedItem = 0;
+    private final Folder mFolder;
 
-    private Folder mFolder;
-
-    private final ConversationCursor mConversationCursor;
-
-    private SwipeableListView mListView;
+    private final SwipeableListView mListView;
 
     public SelectedConversationsActionMenu(RestrictedActivity activity,
-            ConversationSelectionSet selectionSet, AnimatedAdapter adapter,
-            AbstractActivityController controller, Account account,
+            ConversationSelectionSet selectionSet, Account account,
             Folder folder, SwipeableListView list) {
         mActivity = activity;
         mSelectionSet = selectionSet;
-        mListAdapter = adapter;
-        mConversationCursor = (ConversationCursor)adapter.getCursor();
-        mController = controller;
         mAccount = account;
         mFolder = folder;
         mListView = list;
 
         mContext = mActivity.getActivityContext();
-    }
-
-    /**
-     * Registers a destructive action with the controller and returns it.
-     * @param type the resource id of the menu item that corresponds to this action: R.id.delete
-     *  for example.
-     * @return the {@link DestructiveAction} associated with this action.
-     */
-    // TODO(viki): This is a placeholder during the refactoring. Ideally the controller hands
-    // the ID of the action to clients.
-    private final DestructiveAction getAction(int type) {
-        return mController.getBatchDestruction(type);
+        mUpdater = ((ControllableActivity) mActivity).getConversationUpdater();
     }
 
     @Override
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
         boolean handled = true;
-        Collection<Conversation> conversations = mSelectionSet.values();
         switch (item.getItemId()) {
             case R.id.delete:
                 performDestructiveAction(R.id.delete);
@@ -137,10 +113,10 @@
                 performDestructiveAction(R.id.archive);
                 break;
             case R.id.mute:
-                mListAdapter.delete(conversations, getAction(R.id.mute));
+                mUpdater.delete(mSelectionSet.values(), mUpdater.getBatchAction(R.id.mute));
                 break;
             case R.id.report_spam:
-                mListAdapter.delete(conversations, getAction(R.id.report_spam));
+                mUpdater.delete(mSelectionSet.values(), mUpdater.getBatchAction(R.id.report_spam));
                 break;
             case R.id.read:
                 markConversationsRead(true);
@@ -183,7 +159,7 @@
                     }
                 }
                 if (!cantMove) {
-                    new FoldersSelectionDialog(mContext, acct, mController,
+                    new FoldersSelectionDialog(mContext, acct, mUpdater,
                             mSelectionSet.values(), true).show();
                 }
                 break;
@@ -215,7 +191,7 @@
      * Update the underlying list adapter and redraw the menus if necessary.
      */
     private void updateSelection() {
-        mListAdapter.notifyDataSetChanged();
+        mUpdater.refreshConversationList();
         if (mActionMode != null) {
             // Calling mActivity.invalidateOptionsMenu doesn't have the correct behavior, since
             // the action mode is not refreshed when activity's options menu is invalidated.
@@ -226,7 +202,7 @@
     }
 
     private void performDestructiveAction(final int id) {
-        final DestructiveAction action = getAction(id);
+        final DestructiveAction action = mUpdater.getBatchAction(id);
         final Settings settings = mActivity.getSettings();
         final Collection<Conversation> conversations = mSelectionSet.values();
         final boolean showDialog = (settings != null
@@ -247,7 +223,6 @@
         }
     }
 
-
     private void destroy(int id, final Collection<Conversation> conversations,
             final DestructiveAction listener) {
         if (id == R.id.archive) {
@@ -257,35 +232,55 @@
             }
             mListView.archiveItems(views, listener);
         } else {
-            mListAdapter.delete(conversations, listener);
+            mUpdater.delete(conversations, listener);
         }
     }
 
+    /**
+     * Marks the read state of currently selected conversations (<b>and</b> the backing storage)
+     * to the value provided here.
+     * @param read is true if the conversations are to be marked as read, false if they are to be
+     * marked unread.
+     */
     private void markConversationsRead(boolean read) {
-        final Collection<Conversation> conversations = mSelectionSet.values();
-        mConversationCursor.updateBoolean(mContext, conversations, ConversationColumns.READ, read);
-        updateSelection();
-    }
-
-    private void markConversationsImportant(boolean important) {
-        final Collection<Conversation> conversations = mSelectionSet.values();
-        final int priority = important ? UIProvider.ConversationPriority.HIGH
-                : UIProvider.ConversationPriority.LOW;
-        mConversationCursor.updateInt(mContext, conversations, ConversationColumns.PRIORITY,
-                priority);
+        final Collection<Conversation> target = mSelectionSet.values();
+        mUpdater.updateConversation(target, ConversationColumns.READ, read);
+        // Update the conversations in the selection too.
+        for (final Conversation c : target) {
+            c.read = read;
+        }
         updateSelection();
     }
 
     /**
-     * Mark the selected conversations with the star setting provided here.
+     * Marks the important state of currently selected conversations (<b>and</b> the backing
+     * storage) to the value provided here.
+     * @param important is true if the conversations are to be marked as important, false if they
+     * are to be marked not important.
+     */
+    private void markConversationsImportant(boolean important) {
+        final Collection<Conversation> target = mSelectionSet.values();
+        final int priority = important ? UIProvider.ConversationPriority.HIGH
+                : UIProvider.ConversationPriority.LOW;
+        mUpdater.updateConversation(target, ConversationColumns.PRIORITY, priority);
+        // Update the conversations in the selection too.
+        for (final Conversation c : target) {
+            c.priority = priority;
+        }
+        updateSelection();
+    }
+
+    /**
+     * Marks the selected conversations with the star setting provided here.
      * @param star true if you want all the conversations to have stars, false if you want to remove
      * stars from all conversations
      */
     private void starConversations(boolean star) {
-        final Collection<Conversation> conversations = mSelectionSet.values();
-        if (conversations.size() > 0) {
-            mConversationCursor.updateBoolean(mContext, conversations, ConversationColumns.STARRED,
-                    star);
+        final Collection<Conversation> target = mSelectionSet.values();
+        mUpdater.updateConversation(target, ConversationColumns.STARRED, star);
+        // Update the conversations in the selection too.
+        for (final Conversation c : target) {
+            c.starred = star;
         }
         updateSelection();
     }
@@ -431,7 +426,7 @@
         deactivate();
         mSelectionSet.removeObserver(this);
         clearSelection();
-        mListAdapter.notifyDataSetChanged();
+        mUpdater.refreshConversationList();
     }
 
     /**
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index 6324686..0dca32a 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -527,7 +527,7 @@
         message.bodyText = mBodyView.getText().toString();
         message.embedsExternalResources = false;
         message.refMessageId = mRefMessage != null ? mRefMessage.uri.toString() : null;
-        message.draftType = mode;
+        message.draftType = getDraftType(mode);
         message.appendRefMessageContent = mQuotedTextView.getQuotedTextIfIncluded() != null;
         ArrayList<Attachment> attachments = mAttachmentsView.getAttachments();
         message.hasAttachments = attachments != null && attachments.size() > 0;
@@ -803,12 +803,28 @@
                 addAttachmentAndUpdateView(a);
             }
         }
-
+        int quotedTextIndex = message.appendRefMessageContent ?
+                message.quotedTextOffset : -1;
         // Set the body
+        CharSequence quotedText = null;
         if (!TextUtils.isEmpty(message.bodyHtml)) {
-            mBodyView.setText(Html.fromHtml(message.bodyHtml));
+            CharSequence htmlText = Html.fromHtml(message.bodyHtml);
+            if (quotedTextIndex > -1) {
+                htmlText = htmlText.subSequence(0, quotedTextIndex);
+                quotedText = message.bodyHtml.subSequence(quotedTextIndex,
+                        message.bodyHtml.length());
+            }
+            mBodyView.setText(htmlText);
         } else {
-            mBodyView.setText(message.bodyText);
+            CharSequence bodyText = quotedTextIndex > -1 ?
+                    message.bodyText.substring(0, quotedTextIndex) : message.bodyText;
+            if (quotedTextIndex > -1) {
+                quotedText = message.bodyText.substring(quotedTextIndex);
+            }
+            mBodyView.setText(bodyText);
+        }
+        if (quotedTextIndex > -1 && quotedText != null) {
+            mQuotedTextView.setQuotedTextFromDraft(quotedText, mForward);
         }
     }
 
@@ -886,15 +902,23 @@
 
     @VisibleForTesting
     protected String decodeEmailInUri(String s) throws UnsupportedEncodingException {
-        // TODO: handle the case where there are spaces in the display name as well as the email
-        // such as "Guy with spaces <guy+with+spaces@gmail.com>" as they it could be encoded
-        // ambiguously.
-
+        // TODO: handle the case where there are spaces in the display name as
+        // well as the email such as "Guy with spaces <guy+with+spaces@gmail.com>"
+        // as they could be encoded ambiguously.
         // Since URLDecode.decode changes + into ' ', and + is a valid
         // email character, we need to find/ replace these ourselves before
         // decoding.
         String replacePlus = s.replace("+", "%2B");
-        return URLDecoder.decode(replacePlus, UTF8_ENCODING_NAME);
+        try {
+            return URLDecoder.decode(replacePlus, UTF8_ENCODING_NAME);
+        } catch (IllegalArgumentException e) {
+            if (LogUtils.isLoggable(LOG_TAG, LogUtils.VERBOSE)) {
+                LogUtils.e(LOG_TAG, "%s while decoding '%s'", e.getMessage(), s);
+            } else {
+                LogUtils.e(LOG_TAG, e, "Exception  while decoding mailto address");
+            }
+            return null;
+        }
     }
 
     /**
@@ -915,7 +939,9 @@
             } else {
                 to = decodeEmailInUri(mailToString.substring(length, index));
             }
-            addToAddresses(Arrays.asList(TextUtils.split(to, ",")));
+            if (!TextUtils.isEmpty(to)) {
+                addToAddresses(Arrays.asList(TextUtils.split(to, ",")));
+            }
         } catch (UnsupportedEncodingException e) {
             if (LogUtils.isLoggable(LOG_TAG, LogUtils.VERBOSE)) {
                 LogUtils.e(LOG_TAG, "%s while decoding '%s'", e.getMessage(), mailToString);
@@ -1351,7 +1377,7 @@
                 showCcBccViews();
                 break;
             case R.id.save:
-                doSave(true, false);
+                doSave(true);
                 break;
             case R.id.send:
                 doSend();
@@ -1383,12 +1409,16 @@
         sendOrSaveWithSanityChecks(false, true, false);
     }
 
-    private void doSave(boolean showToast, boolean resetIME) {
+    private void doSave(boolean showToast) {
+        // Clear the IME composing suggestions from the body and subject before saving.
+        clearImeText(mBodyView);
+        clearImeText(mSubject);
         sendOrSaveWithSanityChecks(true, showToast, false);
-        if (resetIME) {
-            // Clear the IME composing suggestions from the body.
-            BaseInputConnection.removeComposingSpans(mBodyView.getEditableText());
-        }
+    }
+
+    private void clearImeText(TextView v) {
+        v.clearComposingText();
+        BaseInputConnection.removeComposingSpans(v.getEditableText());
     }
 
     /*package*/ interface SendOrSaveCallback {
@@ -1826,21 +1856,7 @@
                 fullBody.append(text);
             }
         }
-        int draftType = -1;
-        switch (composeMode) {
-            case ComposeActivity.COMPOSE:
-                draftType = DraftType.COMPOSE;
-                break;
-            case ComposeActivity.REPLY:
-                draftType = DraftType.REPLY;
-                break;
-            case ComposeActivity.REPLY_ALL:
-                draftType = DraftType.REPLY_ALL;
-                break;
-            case ComposeActivity.FORWARD:
-                draftType = DraftType.FORWARD;
-                break;
-        }
+        int draftType = getDraftType(composeMode);
         MessageModification.putDraftType(values, draftType);
         if (refMessage != null) {
             if (!TextUtils.isEmpty(refMessage.bodyHtml)) {
@@ -1871,6 +1887,25 @@
         return sendOrSaveMessage.requestId();
     }
 
+    private static int getDraftType(int mode) {
+        int draftType = -1;
+        switch (mode) {
+            case ComposeActivity.COMPOSE:
+                draftType = DraftType.COMPOSE;
+                break;
+            case ComposeActivity.REPLY:
+                draftType = DraftType.REPLY;
+                break;
+            case ComposeActivity.REPLY_ALL:
+                draftType = DraftType.REPLY_ALL;
+                break;
+            case ComposeActivity.FORWARD:
+                draftType = DraftType.FORWARD;
+                break;
+        }
+        return draftType;
+    }
+
     private void sendOrSave(Spanned body, boolean save, boolean showToast,
             boolean orientationChanged) {
         // Check if user is a monkey. Monkeys can compose and hit send
@@ -2267,7 +2302,7 @@
         }
 
         if (shouldSave()) {
-            doSave(!mAddingAttachment /* show toast */, true /* reset IME */);
+            doSave(!mAddingAttachment /* show toast */);
         }
     }
 
diff --git a/src/com/android/mail/compose/QuotedTextView.java b/src/com/android/mail/compose/QuotedTextView.java
index 5337ca4..69c8296 100644
--- a/src/com/android/mail/compose/QuotedTextView.java
+++ b/src/com/android/mail/compose/QuotedTextView.java
@@ -294,6 +294,15 @@
         allowRespondInline(true);
     }
 
+    public void setQuotedTextFromDraft(CharSequence htmlText, boolean forward) {
+        setVisibility(View.VISIBLE);
+        setQuotedText(htmlText);
+        allowQuotedText(!forward);
+        // If there is quoted text, we always allow respond inline, since this
+        // may be a forward.
+        allowRespondInline(true);
+    }
+
     /**
      * Set quoted text. Some use cases may not want to display the check box (i.e. forwarding) so
      * allow control of that.
@@ -315,11 +324,11 @@
     }
 
     public static boolean containsQuotedText(String text) {
-        int pos = text.indexOf(QuotedTextView.HEADER_SEPARATOR);
+        int pos = text.indexOf(QuotedTextView.QUOTE_BEGIN);
         return pos >= 0;
     }
 
     public static int getQuotedTextOffset(String text) {
-        return text.indexOf(QuotedTextView.HEADER_SEPARATOR) + HEADER_SEPARATOR_LENGTH;
+        return text.indexOf(QuotedTextView.QUOTE_BEGIN);
     }
 }
diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java
index d5ef631..c9b1c10 100644
--- a/src/com/android/mail/providers/UIProvider.java
+++ b/src/com/android/mail/providers/UIProvider.java
@@ -740,6 +740,9 @@
         public static final int CALENDAR_INVITE = 1<<4;
     }
 
+    /**
+     * Names of columns representing fields in a Conversation.
+     */
     public static final class ConversationColumns {
         public static final String URI = "conversationUri";
         /**
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 6de5ce3..32a27a3 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -53,7 +53,6 @@
 import com.android.mail.ConversationListContext;
 import com.android.mail.R;
 import com.android.mail.browse.ConversationCursor;
-import com.android.mail.browse.ConversationCursor.ConversationListener;
 import com.android.mail.browse.ConversationPagerController;
 import com.android.mail.browse.SelectedConversationsActionMenu;
 import com.android.mail.compose.ComposeActivity;
@@ -96,8 +95,7 @@
  * In the Gmail codebase, this was called BaseActivityController
  * </p>
  */
-public abstract class AbstractActivityController implements ActivityController,
-        ConversationListener, OnScrollListener {
+public abstract class AbstractActivityController implements ActivityController {
     // Keys for serialization of various information in Bundles.
     /** Tag for {@link #mAccount} */
     private static final String SAVED_ACCOUNT = "saved-account";
@@ -617,21 +615,24 @@
                 break;
             }
             case R.id.mark_important:
-                updateCurrentConversation(ConversationColumns.PRIORITY,
-                        UIProvider.ConversationPriority.HIGH);
+                updateConversation(Conversation.listOf(mCurrentConversation),
+                        ConversationColumns.PRIORITY, UIProvider.ConversationPriority.HIGH);
                 break;
             case R.id.mark_not_important:
-                updateCurrentConversation(ConversationColumns.PRIORITY,
-                        UIProvider.ConversationPriority.LOW);
+                updateConversation(Conversation.listOf(mCurrentConversation),
+                        ConversationColumns.PRIORITY, UIProvider.ConversationPriority.LOW);
                 break;
             case R.id.mute:
-                requestDelete(target, getAction(R.id.mute, target));
+                delete(target, getAction(R.id.mute, target));
                 break;
             case R.id.report_spam:
-                requestDelete(target, getAction(R.id.report_spam, target));
+                delete(target, getAction(R.id.report_spam, target));
                 break;
             case R.id.inside_conversation_unread:
-                updateCurrentConversation(ConversationColumns.READ, false);
+                // TODO(viki): This is strange, and potentially incorrect. READ is an int column
+                // in the provider.
+                updateConversation(Conversation.listOf(mCurrentConversation),
+                        ConversationColumns.READ, false);
                 mViewMode.enterConversationListMode();
                 break;
             case android.R.id.home:
@@ -673,31 +674,23 @@
         return handled;
     }
 
-    /**
-     * Update the specified column name in conversation for a boolean value.
-     * @param columnName
-     * @param value
-     */
-    protected void updateCurrentConversation(String columnName, boolean value) {
-        mConversationListCursor.updateBoolean(mContext, Conversation.listOf(mCurrentConversation),
-                columnName, value);
+    @Override
+    public void updateConversation(Collection <Conversation> target, String columnName,
+            boolean value) {
+        mConversationListCursor.updateBoolean(mContext, target, columnName, value);
         refreshConversationList();
     }
 
-    /**
-     * Update the specified column name in conversation for an integer value.
-     * @param columnName
-     * @param value
-     */
-    protected void updateCurrentConversation(String columnName, int value) {
-        mConversationListCursor.updateInt(mContext, Conversation.listOf(mCurrentConversation),
-                columnName, value);
+    @Override
+    public void updateConversation(Collection <Conversation> target, String columnName, int value) {
+        mConversationListCursor.updateInt(mContext, target, columnName, value);
         refreshConversationList();
     }
 
-    protected void updateCurrentConversation(String columnName, String value) {
-        mConversationListCursor.updateString(mContext, Conversation.listOf(mCurrentConversation),
-                columnName, value);
+    @Override
+    public void updateConversation(Collection <Conversation> target, String columnName,
+            String value) {
+        mConversationListCursor.updateString(mContext, target, columnName, value);
         refreshConversationList();
     }
 
@@ -725,7 +718,7 @@
             final AlertDialog.OnClickListener onClick = new AlertDialog.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
-                    requestDelete(target, action);
+                    delete(target, action);
                 }
             };
             final CharSequence message = Utils.formatPlural(mContext, confirmResource,
@@ -735,16 +728,12 @@
                     .setNegativeButton(R.string.cancel, null)
                     .create().show();
         } else {
-            requestDelete(target, action);
+            delete(target, action);
         }
     }
 
-    /**
-     * Requests the removal of the current conversation with the specified destructive action.
-     * @param action
-     */
-    protected void requestDelete(final Collection<Conversation> target,
-            final DestructiveAction action) {
+    @Override
+    public void delete(final Collection<Conversation> target, final DestructiveAction action) {
         // The conversation list handles deletion if it exists.
         final ConversationListFragment convList = getConversationListFragment();
         if (convList != null) {
@@ -770,7 +759,7 @@
      * @param target
      * @param action
      */
-    protected void requestUpdate(final Collection<Conversation> target,
+    private void requestUpdate(final Collection<Conversation> target,
             final DestructiveAction action) {
         action.performAction();
         refreshConversationList();
@@ -1426,7 +1415,7 @@
      * clients should only require {@link DestructiveAction}s, not specific implementations of the.
      * Only the controllers should know what kind of destructive actions are being created.
      */
-    protected class ConversationAction implements DestructiveAction {
+    private class ConversationAction implements DestructiveAction {
         /**
          * The action to be performed. This is specified as the resource ID of the menu item
          * corresponding to this action: R.id.delete, R.id.report_spam, etc.
@@ -1547,7 +1536,7 @@
      * @param target the conversations to act upon.
      * @return a {@link DestructiveAction} that performs the specified action.
      */
-    protected final DestructiveAction getAction(int action, Collection<Conversation> target) {
+    private final DestructiveAction getAction(int action, Collection<Conversation> target) {
         final DestructiveAction da = new ConversationAction(action, target, false);
         registerDestructiveAction(da);
         return da;
@@ -1556,7 +1545,7 @@
     // Called from the FolderSelectionDialog after a user is done selecting folders to assign the
     // conversations to.
     @Override
-    public final void onFolderChangesCommit(
+    public final void assignFolder(
             Collection<Folder> folders, Collection<Conversation> target, boolean batch) {
         final boolean isDestructive = !Folder.containerIncludes(folders, mFolder);
         LogUtils.d(LOG_TAG, "onFolderChangesCommit: isDestructive = %b", isDestructive);
@@ -1570,7 +1559,7 @@
         // Update the UI elements depending no their visibility and availability
         // TODO(viki): Consolidate this into a single method requestDelete.
         if (isDestructive) {
-            requestDelete(target, folderChange);
+            delete(target, folderChange);
         } else {
             requestUpdate(target, folderChange);
         }
@@ -1688,9 +1677,8 @@
         if (convList == null) {
             return;
         }
-        mCabActionMenu = new SelectedConversationsActionMenu(mActivity, set,
-                convList.getAnimatedAdapter(), this,
-                mAccount, mFolder, (SwipeableListView) convList.getListView());
+        mCabActionMenu = new SelectedConversationsActionMenu(mActivity, set, mAccount, mFolder,
+                (SwipeableListView) convList.getListView());
         enableCabMode();
     }
 
@@ -1772,7 +1760,7 @@
         final Collection<Folder> dropTarget = Folder.listOf(folder);
         // Drag and drop is destructive: we remove conversations from the current folder.
         final DestructiveAction action = getFolderChange(conversations, dropTarget, true, true);
-        requestDelete(conversations, action);
+        delete(conversations, action);
     }
 
     @Override
@@ -1912,12 +1900,8 @@
         return;
     }
 
-    /**
-     * Get a destructive action for selected conversations.
-     * @param action
-     * @return
-     */
-    public final DestructiveAction getBatchDestruction(int action) {
+    @Override
+    public final DestructiveAction getBatchAction(int action) {
         final DestructiveAction da = new ConversationAction(action, mSelectedSet.values(), true);
         registerDestructiveAction(da);
         return da;
@@ -1987,10 +1971,8 @@
         return da;
     }
 
-    /**
-     * Safely refresh the conversation list if it exists.
-     */
-    protected final void refreshConversationList() {
+    @Override
+    public final void refreshConversationList() {
         final ConversationListFragment convList = getConversationListFragment();
         if (convList == null) {
             return;
diff --git a/src/com/android/mail/ui/ActivityController.java b/src/com/android/mail/ui/ActivityController.java
index 1eef46e..ede3a5e 100644
--- a/src/com/android/mail/ui/ActivityController.java
+++ b/src/com/android/mail/ui/ActivityController.java
@@ -27,13 +27,14 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.widget.AbsListView.OnScrollListener;
 
 import com.android.mail.ConversationListContext;
+import com.android.mail.browse.ConversationCursor.ConversationListener;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.Settings;
-import com.android.mail.ui.FoldersSelectionDialog.FolderChangeCommitListener;
 import com.android.mail.ui.ViewMode.ModeChangeListener;
 
 /**
@@ -42,10 +43,11 @@
  * or respond to user action.
  */
 public interface ActivityController extends LayoutListener, SubjectDisplayChanger,
-        ModeChangeListener, ConversationListCallbacks, FolderChangeCommitListener,
+        ModeChangeListener, ConversationListCallbacks,
         FolderChangeListener, AccountChangeListener, LoaderManager.LoaderCallbacks<Cursor>,
-        ConversationSetObserver,
-        FolderListFragment.FolderListSelectionListener, HelpCallback, UndoBarView.UndoListener {
+        ConversationSetObserver, ConversationListener, OnScrollListener,
+        FolderListFragment.FolderListSelectionListener, HelpCallback, UndoBarView.UndoListener,
+        ConversationUpdater {
 
     // As far as possible, the methods here that correspond to Activity lifecycle have the same name
     // as their counterpart in the Activity lifecycle.
diff --git a/src/com/android/mail/ui/ControllableActivity.java b/src/com/android/mail/ui/ControllableActivity.java
index ce573be..689627b 100644
--- a/src/com/android/mail/ui/ControllableActivity.java
+++ b/src/com/android/mail/ui/ControllableActivity.java
@@ -67,6 +67,11 @@
      */
     boolean shouldShowFirstConversation();
 
+    /**
+     * Get the set of currently selected conversations. This method returns a non-null value.
+     * In case no conversation is currently selected, it returns an empty selection set.
+     * @return
+     */
     ConversationSelectionSet getSelectedSet();
 
     /**
@@ -82,4 +87,12 @@
      * Get the folder currently being accessed by the activity.
      */
     Folder getCurrentFolder();
+
+    /**
+     * Returns an object that can update conversation state. Holding a reference to the
+     * ConversationUpdater is safe since the ConversationUpdater is guaranteed to persist across
+     * changes to the conversation cursor.
+     * @return
+     */
+    ConversationUpdater getConversationUpdater();
 }
diff --git a/src/com/android/mail/ui/ConversationUpdater.java b/src/com/android/mail/ui/ConversationUpdater.java
new file mode 100644
index 0000000..45dbf91
--- /dev/null
+++ b/src/com/android/mail/ui/ConversationUpdater.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2012 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 com.android.mail.providers.Conversation;
+import com.android.mail.providers.Folder;
+import com.android.mail.providers.UIProvider;
+
+import java.util.Collection;
+
+/**
+ * Classes that can update conversations implement this interface.
+ */
+public interface ConversationUpdater {
+    /**
+     * Modify the given conversation by changing the column provided here to contain the value
+     * provided. Column names are listed in {@link UIProvider.ConversationColumns}, for example
+     * {@link UIProvider.ConversationColumns#FOLDER_LIST}
+     * @param target
+     * @param columnName
+     * @param value
+     */
+    void updateConversation(Collection <Conversation> target, String columnName, String value);
+
+    /**
+     * Modify the given conversation by changing the column provided here to contain the value
+     * provided. Column names are listed in {@link UIProvider.ConversationColumns}, for example
+     * {@link UIProvider.ConversationColumns#READ}
+     * @param target
+     * @param columnName
+     * @param value
+     */
+    void updateConversation(Collection <Conversation> target, String columnName, int value);
+
+    /**
+     * Modify the given conversation by changing the column provided here to contain the value
+     * provided. Column names are listed in {@link UIProvider.ConversationColumns}, for example
+     * {@link UIProvider.ConversationColumns#HAS_ATTACHMENTS}
+     * @param target
+     * @param columnName
+     * @param value
+     */
+    void updateConversation(Collection <Conversation> target, String columnName, boolean value);
+
+    /**
+     * Requests the removal of the current conversation with the specified destructive action.
+     * @param target the conversations to act upon.
+     * @param action to perform after the UI has been updated to remove the conversations
+     */
+    void delete(final Collection<Conversation> target, final DestructiveAction action);
+
+    /**
+     * Get a destructive action for selected conversations. The action corresponds to Menu item
+     * identifiers, for example R.id.unread, or R.id.delete.
+     * @param action
+     * @return
+     */
+    public DestructiveAction getBatchAction(int action);
+
+    /**
+     * Assign the target conversations to the given folders, and remove them from all other
+     * folders that they might be assigned to.
+     * @param folders the folders to assign the conversations to.
+     * @param target the conversations to act upon.
+     * @param batch whether this is a batch operation
+     */
+    public void assignFolder(
+            Collection<Folder> folders, Collection<Conversation> target, boolean batch);
+
+    /**
+     * Refreshes the conversation list, if one exists.
+     */
+    void refreshConversationList();
+}
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index 3260463..b3436f1 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -144,6 +144,8 @@
     public static final String ARG_CONVERSATION = "conversation";
     private static final String ARG_FOLDER = "folder";
 
+    private static final boolean DEBUG_DUMP_CONVERSATION_HTML = false;
+
     /**
      * Constructor needs to be public to handle orientation changes and activity lifecycle events.
      */
@@ -403,8 +405,28 @@
     }
 
     private void renderConversation(MessageCursor messageCursor) {
-        mWebView.loadDataWithBaseURL(mBaseUri, renderMessageBodies(messageCursor), "text/html",
-                "utf-8", null);
+        final String convHtml = renderMessageBodies(messageCursor);
+
+        if (DEBUG_DUMP_CONVERSATION_HTML) {
+            java.io.FileWriter fw = null;
+            try {
+                fw = new java.io.FileWriter("/sdcard/conv" + mConversation.id
+                        + ".html");
+                fw.write(convHtml);
+            } catch (java.io.IOException e) {
+                e.printStackTrace();
+            } finally {
+                if (fw != null) {
+                    try {
+                        fw.close();
+                    } catch (java.io.IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+
+        mWebView.loadDataWithBaseURL(mBaseUri, convHtml, "text/html", "utf-8", null);
         mCursor = messageCursor;
     }
 
diff --git a/src/com/android/mail/ui/FolderSelectionActivity.java b/src/com/android/mail/ui/FolderSelectionActivity.java
index bcf8c6f..6f38925 100644
--- a/src/com/android/mail/ui/FolderSelectionActivity.java
+++ b/src/com/android/mail/ui/FolderSelectionActivity.java
@@ -319,4 +319,9 @@
     public Folder getCurrentFolder() {
         return null;
     }
+
+    @Override
+    public ConversationUpdater getConversationUpdater() {
+        return null;
+    }
 }
diff --git a/src/com/android/mail/ui/FoldersSelectionDialog.java b/src/com/android/mail/ui/FoldersSelectionDialog.java
index b971c4c..21ad75e 100644
--- a/src/com/android/mail/ui/FoldersSelectionDialog.java
+++ b/src/com/android/mail/ui/FoldersSelectionDialog.java
@@ -42,29 +42,16 @@
 
 public class FoldersSelectionDialog implements OnClickListener, OnMultiChoiceClickListener {
     private AlertDialog mDialog;
-    private FolderChangeCommitListener mCommitListener;
+    private ConversationUpdater mUpdater;
     private HashMap<Folder, Boolean> mCheckedState;
     private boolean mSingle = false;
     private FolderSelectorAdapter mAdapter;
     private final Collection<Conversation> mTarget;
     private boolean mBatch;
 
-    public interface FolderChangeCommitListener {
-        /**
-         * Assign the target conversations to the given folders, and remove them from all other
-         * folders that they might be assigned to.
-         * @param folders the folders to assign the conversations to.
-         * @param target the conversations to act upon.
-         * @param batch whether this is a batch operation
-         */
-        public void onFolderChangesCommit(
-                Collection<Folder> folders, Collection<Conversation> target, boolean batch);
-    }
-
     public FoldersSelectionDialog(final Context context, Account account,
-            final FolderChangeCommitListener commitListener,
-            Collection<Conversation> target, boolean isBatch) {
-        mCommitListener = commitListener;
+            final ConversationUpdater updater, Collection<Conversation> target, boolean isBatch) {
+        mUpdater = updater;
         mTarget = target;
         mBatch = isBatch;
 
@@ -152,8 +139,8 @@
                         folders.add(entry.getKey());
                     }
                 }
-                if (mCommitListener != null) {
-                    mCommitListener.onFolderChangesCommit(folders, mTarget, mBatch);
+                if (mUpdater != null) {
+                    mUpdater.assignFolder(folders, mTarget, mBatch);
                 }
                 break;
             case DialogInterface.BUTTON_NEGATIVE:
diff --git a/src/com/android/mail/ui/MailActivity.java b/src/com/android/mail/ui/MailActivity.java
index d09bb71..af26817 100644
--- a/src/com/android/mail/ui/MailActivity.java
+++ b/src/com/android/mail/ui/MailActivity.java
@@ -300,4 +300,9 @@
     public Folder getCurrentFolder() {
         return mController.getFolder();
     }
+
+    @Override
+    public ConversationUpdater getConversationUpdater() {
+        return mController;
+    }
 }
diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java
index e7d8927..7c580bb 100644
--- a/src/com/android/mail/ui/OnePaneController.java
+++ b/src/com/android/mail/ui/OnePaneController.java
@@ -93,9 +93,7 @@
     @Override
     public void resetActionBarIcon() {
         final int mode = mViewMode.getMode();
-        // If the settings aren't loaded yet, we may not know what the default
-        // inbox is, so err toward this being the account inbox.
-        if ((mAccount.settings != null && mConvListContext != null && !inInbox())
+        if (!inInbox(mAccount, mConvListContext)
                 || mode == ViewMode.SEARCH_RESULTS_LIST
                 || mode == ViewMode.SEARCH_RESULTS_CONVERSATION
                 || mode == ViewMode.CONVERSATION
@@ -111,10 +109,14 @@
      * inbox.
      * @return
      */
-    private boolean inInbox() {
-        final Uri inboxUri = Settings.getDefaultInboxUri(mAccount.settings);
-        return mConvListContext != null && mConvListContext.folder != null ? (!mConvListContext
-                .isSearchResult() && mConvListContext.folder.uri.equals(inboxUri)) : false;
+    private static boolean inInbox(final Account account, final ConversationListContext context) {
+        // If we don't have valid state, then we are not in the inbox.
+        if (account == null || context == null || context.folder == null
+                || account.settings == null) {
+            return false;
+        }
+        final Uri inboxUri = Settings.getDefaultInboxUri(account.settings);
+        return !context.isSearchResult() && context.folder.uri.equals(inboxUri);
     }
 
     @Override
@@ -165,7 +167,7 @@
                 : FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
         Fragment conversationListFragment = ConversationListFragment.newInstance(listContext);
 
-        if (!inInbox()) {
+        if (!inInbox(mAccount, mConvListContext)) {
             // Maintain fragment transaction history so we can get back to the
             // fragment used to launch this list.
             mLastConversationListTransactionId = replaceFragment(conversationListFragment,
@@ -290,13 +292,13 @@
      */
     @Override
     public boolean onBackPressed() {
-        int mode = mViewMode.getMode();
+        final int mode = mViewMode.getMode();
         if (mode == ViewMode.FOLDER_LIST) {
             mLastFolderListTransactionId = INVALID_ID;
             transitionToInbox();
         } else if (mode == ViewMode.SEARCH_RESULTS_LIST) {
             mActivity.finish();
-        } else if (mode == ViewMode.CONVERSATION_LIST && !inInbox()) {
+        } else if (mode == ViewMode.CONVERSATION_LIST && !inInbox(mAccount, mConvListContext)) {
             if (isTransactionIdValid(mLastFolderListTransactionId)) {
                 // Go back to previous folder list.
                 mViewMode.enterFolderListMode();
@@ -366,7 +368,7 @@
         final int mode = mViewMode.getMode();
         if (mode == ViewMode.SEARCH_RESULTS_LIST) {
             mActivity.finish();
-        } else if ((!inInbox() && mode == ViewMode.CONVERSATION_LIST)
+        } else if ((!inInbox(mAccount, mConvListContext) && mode == ViewMode.CONVERSATION_LIST)
                 || mode == ViewMode.CONVERSATION
                 || mode == ViewMode.FOLDER_LIST
                 || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {