diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
new file mode 100644
index 0000000..f6c6f02
--- /dev/null
+++ b/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="tablet" msgid="9194799012395299737">"Bellerberging"</string>
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="default" msgid="4282451239358791628">"Bellerberging"</string>
+</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
new file mode 100644
index 0000000..eca8109
--- /dev/null
+++ b/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="tablet" msgid="9194799012395299737">"የደዋይ ማከማቻ"</string>
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="default" msgid="4282451239358791628">"የደዋይ ማከማቻ"</string>
+</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
new file mode 100644
index 0000000..0cee647
--- /dev/null
+++ b/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="tablet" msgid="9194799012395299737">"Storan Pendail"</string>
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="default" msgid="4282451239358791628">"Storan Pendail"</string>
+</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
new file mode 100644
index 0000000..dd1b430
--- /dev/null
+++ b/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="tablet" msgid="9194799012395299737">"Hifadhi ya Kipigaji"</string>
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="default" msgid="4282451239358791628">"Hifadhi ya Kipigaji"</string>
+</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
new file mode 100644
index 0000000..e2d5490
--- /dev/null
+++ b/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="tablet" msgid="9194799012395299737">"Ukugcina Isidayeli"</string>
+    <!-- outdated translation 4846406803456361049 -->     <string name="app_label" product="default" msgid="4282451239358791628">"Ukugcina Isidayeli"</string>
+</resources>
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index a4e6919..5df3fdf 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -36,7 +36,6 @@
 import android.provider.Telephony.Mms.Part;
 import android.provider.Telephony.Mms.Rate;
 import android.text.TextUtils;
-import android.util.Config;
 import android.util.Log;
 
 import com.google.android.mms.pdu.PduHeaders;
@@ -823,7 +822,7 @@
     private final static String VND_ANDROID_MMS = "vnd.android/mms";
     private final static String VND_ANDROID_DIR_MMS = "vnd.android-dir/mms";
     private final static boolean DEBUG = false;
-    private final static boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
+    private final static boolean LOCAL_LOGV = false;
 
     private static final int MMS_ALL                      = 0;
     private static final int MMS_ALL_ID                   = 1;
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index ece8b0e..619ba83 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -22,8 +22,11 @@
 import java.io.File;
 import java.util.ArrayList;
 
+import android.content.BroadcastReceiver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
@@ -205,13 +208,20 @@
                         "     AND part.mid = pdu._id);" +
                         " END";
 
-    private static MmsSmsDatabaseHelper mInstance = null;
+    private static MmsSmsDatabaseHelper sInstance = null;
+    private static boolean sTriedAutoIncrement = false;
+    private static boolean sFakeLowStorageTest = false;     // for testing only
 
     static final String DATABASE_NAME = "mmssms.db";
-    static final int DATABASE_VERSION = 53;
+    static final int DATABASE_VERSION = 54;
+    private final Context mContext;
+    private LowStorageMonitor mLowStorageMonitor;
+
 
     private MmsSmsDatabaseHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
+
+        mContext = context;
     }
 
     /**
@@ -219,10 +229,10 @@
      * database.
      */
     /* package */ static synchronized MmsSmsDatabaseHelper getInstance(Context context) {
-        if (mInstance == null) {
-            mInstance = new MmsSmsDatabaseHelper(context);
+        if (sInstance == null) {
+            sInstance = new MmsSmsDatabaseHelper(context);
         }
-        return mInstance;
+        return sInstance;
     }
 
     public static void updateThread(SQLiteDatabase db, long thread_id) {
@@ -491,6 +501,7 @@
                    Mms._ID + " INTEGER PRIMARY KEY," +
                    Mms.THREAD_ID + " INTEGER," +
                    Mms.DATE + " INTEGER," +
+                   Mms.DATE_SENT + " INTEGER DEFAULT 0," +
                    Mms.MESSAGE_BOX + " INTEGER," +
                    Mms.READ + " INTEGER DEFAULT 0," +
                    Mms.MESSAGE_ID + " TEXT," +
@@ -598,6 +609,7 @@
                    "address TEXT," +
                    "person INTEGER," +
                    "date INTEGER," +
+                   "date_sent INTEGER DEFAULT 0," +
                    "protocol INTEGER," +
                    "read INTEGER DEFAULT 0," +
                    "status INTEGER DEFAULT -1," + // a TP-Status value
@@ -668,7 +680,7 @@
          * and the same set of recipients.
          */
         db.execSQL("CREATE TABLE threads (" +
-                   Threads._ID + " INTEGER PRIMARY KEY," +
+                   Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                    Threads.DATE + " INTEGER DEFAULT 0," +
                    Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
                    Threads.RECIPIENT_IDS + " TEXT," +
@@ -1095,6 +1107,22 @@
             } finally {
                 db.endTransaction();
             }
+            // fall through
+        case 53:
+            if (currentVersion <= 53) {
+                return;
+            }
+
+            db.beginTransaction();
+            try {
+                upgradeDatabaseToVersion54(db);
+                db.setTransactionSuccessful();
+            } catch (Throwable ex) {
+                Log.e(TAG, ex.getMessage(), ex);
+                break;
+            } finally {
+                db.endTransaction();
+            }
             return;
         }
 
@@ -1168,19 +1196,6 @@
         db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.LOCKED + " INTEGER DEFAULT 0");
     }
 
-    private void upgradeDatabaseToVersion53(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update");
-
-        // Updates threads table whenever a message in pdu is updated.
-        db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +
-                   "  UPDATE OF " + Mms.READ +
-                   "  ON " + MmsProvider.TABLE_PDU + " " +
-                   PDU_UPDATE_THREAD_CONSTRAINTS +
-                   "BEGIN " +
-                   PDU_UPDATE_THREAD_READ_BODY +
-                   "END;");
-    }
-
     private void upgradeDatabaseToVersion46(SQLiteDatabase db) {
         // add the "text" column for caching inline text (e.g. strings) instead of
         // putting them in an external file
@@ -1271,6 +1286,142 @@
         }
     }
 
+    private void upgradeDatabaseToVersion53(SQLiteDatabase db) {
+        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update");
+
+        // Updates threads table whenever a message in pdu is updated.
+        db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +
+                   "  UPDATE OF " + Mms.READ +
+                   "  ON " + MmsProvider.TABLE_PDU + " " +
+                   PDU_UPDATE_THREAD_CONSTRAINTS +
+                   "BEGIN " +
+                   PDU_UPDATE_THREAD_READ_BODY +
+                   "END;");
+    }
+
+    private void upgradeDatabaseToVersion54(SQLiteDatabase db) {
+        // Add 'date_sent' column to sms table.
+        db.execSQL("ALTER TABLE sms ADD COLUMN " + Sms.DATE_SENT + " INTEGER DEFAULT 0");
+
+        // Add 'date_sent' column to pdu table.
+        db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.DATE_SENT + " INTEGER DEFAULT 0");
+    }
+
+    @Override
+    public synchronized SQLiteDatabase getWritableDatabase() {
+        SQLiteDatabase db = super.getWritableDatabase();
+
+        if (!sTriedAutoIncrement) {
+            sTriedAutoIncrement = true;
+            boolean hasAutoIncrement = hasAutoIncrement(db);
+            Log.d(TAG, "[getWritableDatabase] hasAutoIncrement: " + hasAutoIncrement);
+            if (!hasAutoIncrement) {
+                db.beginTransaction();
+                try {
+                    if (false && sFakeLowStorageTest) {
+                        Log.d(TAG, "[getWritableDatabase] mFakeLowStorageTest is true " +
+                                " - fake exception");
+                        throw new Exception("FakeLowStorageTest");
+                    }
+                    upgradeThreadsTableToAutoIncrement(db);
+                    db.setTransactionSuccessful();
+
+                    if (mLowStorageMonitor != null) {
+                        // We've already updated the database. This receiver is no longer necessary.
+                        Log.d(TAG, "Unregistering mLowStorageMonitor - we've upgraded");
+                        mContext.unregisterReceiver(mLowStorageMonitor);
+                        mLowStorageMonitor = null;
+                    }
+                } catch (Throwable ex) {
+                    Log.e(TAG, "Failed to add autoIncrement: " + ex.getMessage(), ex);
+
+                    if (sFakeLowStorageTest) {
+                        sFakeLowStorageTest = false;
+                    }
+
+                    // We failed, perhaps because of low storage. Turn on a receiver to watch for
+                    // storage space.
+                    if (mLowStorageMonitor == null) {
+                        Log.d(TAG, "[getWritableDatabase] turning on storage monitor");
+                        mLowStorageMonitor = new LowStorageMonitor();
+                        IntentFilter intentFilter = new IntentFilter();
+                        intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW);
+                        intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
+                        mContext.registerReceiver(mLowStorageMonitor, intentFilter);
+                    }
+                } finally {
+                    db.endTransaction();
+                }
+            }
+        }
+        return db;
+    }
+
+    private boolean hasAutoIncrement(SQLiteDatabase db) {
+        boolean result = false;
+        String query = "SELECT sql FROM sqlite_master WHERE type='table' AND name='threads'";
+        Cursor c = db.rawQuery(query, null);
+        if (c != null) {
+            try {
+                if (c.moveToFirst()) {
+                    String schema = c.getString(0);
+                    result = schema != null ? schema.contains("AUTOINCREMENT") : false;
+                    Log.d(TAG, "[MmsSmsDb] hasAutoIncrement: " + schema + " result: " + result);
+                }
+            } finally {
+                c.close();
+            }
+        }
+        return result;
+    }
+
+    // upgradeThreadsTableToAutoIncrement() is called to add the AUTOINCREMENT keyword to
+    // the threads table. This could fail if the user has a lot of conversations and not enough
+    // storage to make a copy of the threads table. That's ok. This upgrade is optional. It'll
+    // be called again next time the device is rebooted.
+    private void upgradeThreadsTableToAutoIncrement(SQLiteDatabase db) {
+        if (hasAutoIncrement(db)) {
+            Log.d(TAG, "[MmsSmsDb] upgradeThreadsTableToAutoIncrement: already upgraded");
+            return;
+        }
+        Log.d(TAG, "[MmsSmsDb] upgradeThreadsTableToAutoIncrement: upgrading");
+
+        // Make the _id of the threads table autoincrement so we never re-use thread ids
+        // Have to create a new temp threads table. Copy all the info from the old table.
+        // Drop the old table and rename the new table to that of the old.
+        db.execSQL("CREATE TABLE threads_temp (" +
+                Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+                Threads.DATE + " INTEGER DEFAULT 0," +
+                Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
+                Threads.RECIPIENT_IDS + " TEXT," +
+                Threads.SNIPPET + " TEXT," +
+                Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," +
+                Threads.READ + " INTEGER DEFAULT 1," +
+                Threads.TYPE + " INTEGER DEFAULT 0," +
+                Threads.ERROR + " INTEGER DEFAULT 0," +
+                Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
+
+        db.execSQL("INSERT INTO threads_temp SELECT * from threads;");
+        db.execSQL("DROP TABLE threads;");
+        db.execSQL("ALTER TABLE threads_temp RENAME TO threads;");
+    }
+
+    private class LowStorageMonitor extends BroadcastReceiver {
+
+        public LowStorageMonitor() {
+        }
+
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+
+            Log.d(TAG, "[LowStorageMonitor] onReceive intent " + action);
+
+            if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) {
+                sTriedAutoIncrement = false;    // try to upgrade on the next getWriteableDatabase
+            }
+        }
+    }
+
     private void updateThreadsAttachmentColumn(SQLiteDatabase db) {
         // Set the values of that column correctly based on the current
         // contents of the database.
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index bc4bc18..f2c7e9c 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -16,13 +16,11 @@
 
 package com.android.providers.telephony;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import android.app.SearchManager;
 import android.content.ContentProvider;
 import android.content.ContentValues;
 import android.content.Context;
@@ -113,7 +111,7 @@
     // These are the columns that appear in both the MMS ("pdu") and
     // SMS ("sms") message tables.
     private static final String[] MMS_SMS_COLUMNS =
-            { BaseColumns._ID, Mms.DATE, Mms.READ, Mms.THREAD_ID, Mms.LOCKED };
+            { BaseColumns._ID, Mms.DATE, Mms.DATE_SENT, Mms.READ, Mms.THREAD_ID, Mms.LOCKED };
 
     // These are the columns that appear only in the MMS message
     // table.
@@ -178,14 +176,14 @@
 
     // Search on the words table but return the rows from the corresponding sms table
     private static final String SMS_QUERY =
-            "SELECT sms._id AS _id,thread_id,address,body,date,index_text,words._id " +
+            "SELECT sms._id AS _id,thread_id,address,body,date,date_sent,index_text,words._id " +
             "FROM sms,words WHERE (words MATCH ? " +
             "AND sms._id=words.source_id AND words.table_to_use=1)";
 
     // Search on the words table but return the rows from the corresponding parts table
     private static final String MMS_QUERY =
             "SELECT pdu._id,thread_id,addr.address,part.text " +
-            "AS body,pdu.date,index_text,words._id " +
+            "AS body,pdu.date,pdu.date_sent,index_text,words._id " +
             "FROM pdu,part,addr,words WHERE ((part.mid=pdu._id) AND " +
             "(addr.msg_id=pdu._id) AND " +
             "(addr.type=" + PduHeaders.TO + ") AND " +
@@ -289,8 +287,7 @@
         Cursor cursor = null;
         switch(URI_MATCHER.match(uri)) {
             case URI_COMPLETE_CONVERSATIONS:
-                cursor = getCompleteConversations(
-                        projection, selection, selectionArgs, sortOrder);
+                cursor = getCompleteConversations(projection, selection, sortOrder);
                 break;
             case URI_CONVERSATIONS:
                 String simple = uri.getQueryParameter("simple");
@@ -304,13 +301,12 @@
                             projection, selection, selectionArgs, sortOrder);
                 } else {
                     cursor = getConversations(
-                            projection, selection, selectionArgs, sortOrder);
+                            projection, selection, sortOrder);
                 }
                 break;
             case URI_CONVERSATIONS_MESSAGES:
-                cursor = getConversationMessages(
-                        uri.getPathSegments().get(1), projection, selection,
-                        selectionArgs, sortOrder);
+                cursor = getConversationMessages(uri.getPathSegments().get(1), projection,
+                        selection, sortOrder);
                 break;
             case URI_CONVERSATIONS_RECIPIENTS:
                 cursor = getConversationById(
@@ -324,8 +320,7 @@
                 break;
             case URI_MESSAGES_BY_PHONE:
                 cursor = getMessagesByPhoneNumber(
-                        uri.getPathSegments().get(2), projection, selection,
-                        selectionArgs, sortOrder);
+                        uri.getPathSegments().get(2), projection, selection, sortOrder);
                 break;
             case URI_THREAD_ID:
                 List<String> recipients = uri.getQueryParameters("recipient");
@@ -440,7 +435,7 @@
                 break;
             }
             case URI_DRAFT: {
-                cursor = getDraftThread(projection, selection, selectionArgs, sortOrder);
+                cursor = getDraftThread(projection, selection, sortOrder);
                 break;
             }
             case URI_FIRST_LOCKED_MESSAGE_BY_THREAD_ID: {
@@ -452,12 +447,11 @@
                     break;
                 }
                 cursor = getFirstLockedMessage(projection, "thread_id=" + Long.toString(threadId),
-                        null, sortOrder);
+                        sortOrder);
                 break;
             }
             case URI_FIRST_LOCKED_MESSAGE_ALL: {
-                cursor = getFirstLockedMessage(projection, selection,
-                        selectionArgs, sortOrder);
+                cursor = getFirstLockedMessage(projection, selection, sortOrder);
                 break;
             }
             default:
@@ -714,7 +708,7 @@
      *   ;
      */
     private Cursor getDraftThread(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+            String sortOrder) {
         String[] innerProjection = new String[] {BaseColumns._ID, Conversations.THREAD_ID};
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
@@ -726,12 +720,12 @@
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerProjection,
                 MMS_COLUMNS, 1, "mms",
                 concatSelections(selection, Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_DRAFTS),
-                selectionArgs, null, null);
+                null, null);
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerProjection,
                 SMS_COLUMNS, 1, "sms",
                 concatSelections(selection, Sms.TYPE + "=" + Sms.MESSAGE_TYPE_DRAFT),
-                selectionArgs, null, null);
+                null, null);
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
 
         unionQueryBuilder.setDistinct(true);
@@ -744,7 +738,7 @@
         outerQueryBuilder.setTables("(" + unionQuery + ")");
 
         String outerQuery = outerQueryBuilder.buildQuery(
-                projection, null, null, null, null, sortOrder, null);
+                projection, null, null, null, sortOrder, null);
 
         return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
     }
@@ -774,7 +768,7 @@
      * messages.
      */
     private Cursor getConversations(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+            String sortOrder) {
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
@@ -789,12 +783,12 @@
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
                 MMS_COLUMNS, 1, "mms",
-                concatSelections(selection, MMS_CONVERSATION_CONSTRAINT), selectionArgs,
+                concatSelections(selection, MMS_CONVERSATION_CONSTRAINT),
                 "thread_id", "date = MAX(date)");
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection,
                 SMS_COLUMNS, 1, "sms",
-                concatSelections(selection, SMS_CONVERSATION_CONSTRAINT), selectionArgs,
+                concatSelections(selection, SMS_CONVERSATION_CONSTRAINT),
                 "thread_id", "date = MAX(date)");
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
 
@@ -808,7 +802,7 @@
         outerQueryBuilder.setTables("(" + unionQuery + ")");
 
         String outerQuery = outerQueryBuilder.buildQuery(
-                columns, null, null, "tid",
+                columns, null, "tid",
                 "normalized_date = MAX(normalized_date)", sortOrder, null);
 
         return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
@@ -827,7 +821,7 @@
      * there is *any* locked message, not the actual messages themselves.
      */
     private Cursor getFirstLockedMessage(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+            String sortOrder) {
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
@@ -836,16 +830,17 @@
 
         String[] idColumn = new String[] { BaseColumns._ID };
 
+        // NOTE: buildUnionSubQuery *ignores* selectionArgs
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, idColumn,
                 null, 1, "mms",
-                selection, selectionArgs,
+                selection,
                 BaseColumns._ID, "locked=1");
 
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, idColumn,
                 null, 1, "sms",
-                selection, selectionArgs,
+                selection,
                 BaseColumns._ID, "locked=1");
 
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
@@ -869,9 +864,8 @@
      * and SMS.
      */
     private Cursor getCompleteConversations(String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
-        String unionQuery = buildConversationQuery(
-                projection, selection, selectionArgs, sortOrder);
+            String selection, String sortOrder) {
+        String unionQuery = buildConversationQuery(projection, selection, sortOrder);
 
         return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
     }
@@ -900,7 +894,7 @@
      */
     private Cursor getConversationMessages(
             String threadIdString, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+            String sortOrder) {
         try {
             Long.parseLong(threadIdString);
         } catch (NumberFormatException exception) {
@@ -910,8 +904,7 @@
 
         String finalSelection = concatSelections(
                 selection, "thread_id = " + threadIdString);
-        String unionQuery = buildConversationQuery(
-                projection, finalSelection, selectionArgs, sortOrder);
+        String unionQuery = buildConversationQuery(projection, finalSelection, sortOrder);
 
         return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
     }
@@ -936,7 +929,7 @@
      */
     private Cursor getMessagesByPhoneNumber(
             String phoneNumber, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+            String sortOrder) {
         String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(phoneNumber);
         String finalMmsSelection =
                 concatSelections(
@@ -966,10 +959,10 @@
         String[] columns = handleNullMessageProjection(projection);
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, columns, MMS_COLUMNS,
-                0, "mms", finalMmsSelection, selectionArgs, null, null);
+                0, "mms", finalMmsSelection, null, null);
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, columns, SMS_COLUMNS,
-                0, "sms", finalSmsSelection, selectionArgs, null, null);
+                0, "sms", finalSmsSelection, null, null);
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
 
         unionQueryBuilder.setDistinct(true);
@@ -1052,11 +1045,11 @@
         columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
-                columnsPresentInTable, 1, "mms", finalMmsSelection, selectionArgs,
+                columnsPresentInTable, 1, "mms", finalMmsSelection,
                 null, null);
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection,
-                SMS_COLUMNS, 1, "sms", finalSmsSelection, selectionArgs,
+                SMS_COLUMNS, 1, "sms", finalSmsSelection,
                 null, null);
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
 
@@ -1070,7 +1063,7 @@
         outerQueryBuilder.setTables("(" + unionQuery + ")");
 
         String outerQuery = outerQueryBuilder.buildQuery(
-                smsColumns, null, null, null, null, sortOrder, null);
+                smsColumns, null, null, null, sortOrder, null);
 
         return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
     }
@@ -1090,7 +1083,7 @@
     }
 
     private static String buildConversationQuery(String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
+            String selection, String sortOrder) {
         String[] mmsProjection = createMmsProjection(projection);
 
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
@@ -1116,11 +1109,11 @@
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
                 columnsPresentInTable, 0, "mms",
                 concatSelections(mmsSelection, MMS_CONVERSATION_CONSTRAINT),
-                selectionArgs, null, null);
+                null, null);
         String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection, SMS_COLUMNS,
                 0, "sms", concatSelections(selection, SMS_CONVERSATION_CONSTRAINT),
-                selectionArgs, null, null);
+                null, null);
         SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
 
         unionQueryBuilder.setDistinct(true);
@@ -1134,7 +1127,7 @@
         outerQueryBuilder.setTables("(" + unionQuery + ")");
 
         return outerQueryBuilder.buildQuery(
-                smsColumns, null, null, null, null, sortOrder, null);
+                smsColumns, null, null, null, sortOrder, null);
     }
 
     @Override
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index 57ac256..89300b6 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -37,7 +37,6 @@
 import android.telephony.SmsManager;
 import android.telephony.SmsMessage;
 import android.text.TextUtils;
-import android.util.Config;
 import android.util.Log;
 
 import com.android.common.ArrayListCursor;
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 35c884d..5f136e9 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -33,7 +33,6 @@
 import android.os.Environment;
 import android.os.FileUtils;
 import android.provider.Telephony;
-import android.util.Config;
 import android.util.Log;
 import android.util.Xml;
 
@@ -522,7 +521,7 @@
                     notify = true;
                 }
 
-                if (Config.LOGD) Log.d(TAG, "inserted " + values.toString() + " rowID = " + rowID);
+                if (false) Log.d(TAG, "inserted " + values.toString() + " rowID = " + rowID);
                 break;
             }
 
@@ -537,7 +536,7 @@
 
                 if (updated > 0)
                 {
-                    if (Config.LOGD) {
+                    if (false) {
                         Log.d(TAG, "Setting numeric '" + numeric + "' to be the current operator");
                     }
                 }
