diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c1af548..33e4a8d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -21,7 +21,7 @@
 
     <application android:process="com.android.phone"
                  android:allowClearUserData="false"
-                 android:label="Dialer Storage"
+                 android:label="@string/app_label"
                  android:icon="@drawable/ic_launcher_phone">
         <provider android:name="TelephonyProvider" android:authorities="telephony" android:multiprocess="true" />
         <provider android:name="SmsProvider" android:authorities="sms" android:multiprocess="true" 
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644
index 0000000..c61a41b
--- /dev/null
+++ b/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- This is the label for the application that stores phone data -->
+    <string name="app_label">Dialer Storage</string>
+
+</resources>
+
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index ee60142..39d7013 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -20,7 +20,7 @@
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.UriMatcher;
-import com.android.internal.database.ArrayListCursor;
+
 import android.database.Cursor;
 import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabase;
@@ -33,18 +33,20 @@
 import android.provider.Telephony.Sms;
 import android.provider.Telephony.TextBasedSmsColumns;
 import android.provider.Telephony.Threads;
-import android.telephony.gsm.SmsManager;
-import android.telephony.gsm.SmsMessage;
+import android.telephony.SmsManager;
+import android.telephony.SmsMessage;
 import android.text.TextUtils;
 import android.util.Config;
 import android.util.Log;
 
+import com.android.internal.database.ArrayListCursor;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 
 public class SmsProvider extends ContentProvider {
     private static final Uri NOTIFICATION_URI = Uri.parse("content://sms");
-    private static final Uri SIM_URI = Uri.parse("content://sms/sim");
+    private static final Uri ICC_URI = Uri.parse("content://sms/icc");
     static final String TABLE_SMS = "sms";
     private static final String TABLE_RAW = "raw";
     private static final String TABLE_SR_PENDING = "sr_pending";
@@ -53,19 +55,19 @@
 
     /**
      * These are the columns that are available when reading SMS
-     * messages from the SIM.  Columns whose names begin with "is_"
+     * messages from the ICC.  Columns whose names begin with "is_"
      * have either "true" or "false" as their values.
      */
-    private final static String[] SIM_COLUMNS = new String[] {
+    private final static String[] ICC_COLUMNS = new String[] {
         // N.B.: These columns must appear in the same order as the
-        // calls to add appear in convertSimToSms.
+        // calls to add appear in convertIccToSms.
         "service_center_address",       // getServiceCenterAddress
         "address",                      // getDisplayOriginatingAddress
         "message_class",                // getMessageClass
         "body",                         // getDisplayMessageBody
         "date",                         // getTimestampMillis
-        "status",                       // getStatusOnSim
-        "index_on_sim",                 // getIndexOnSim
+        "status",                       // getStatusOnIcc
+        "index_on_icc",                 // getIndexOnIcc
         "is_status_report",             // isStatusReportMessage
         "transport_type",               // Always "sms".
         "type"                          // Always MESSAGE_TYPE_ALL.
@@ -152,8 +154,10 @@
                 break;
 
             case SMS_CONVERSATIONS:
-                qb.setTables("sms, (SELECT thread_id AS group_thread_id, MAX(date) AS group_date, COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups");
-                qb.appendWhere("sms.thread_id = groups.group_thread_id AND sms.date = groups.group_date");
+                qb.setTables("sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,"
+                       + "COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups");
+                qb.appendWhere("sms.thread_id = groups.group_thread_id AND sms.date ="
+                       + "groups.group_date");
                 qb.setProjectionMap(sConversationProjectionMap);
                 break;
 
@@ -187,13 +191,13 @@
                 qb.appendWhere("(_id = " + url.getPathSegments().get(1) + ")");
                 break;
 
-            case SMS_ALL_SIM:
-                return getAllMessagesFromSim();
+            case SMS_ALL_ICC:
+                return getAllMessagesFromIcc();
 
-            case SMS_SIM:
+            case SMS_ICC:
                 String messageIndexString = url.getPathSegments().get(1);
 
-                return getSingleMessageFromSim(messageIndexString);
+                return getSingleMessageFromIcc(messageIndexString);
 
             default:
                 Log.e(TAG, "Invalid request: " + url);
@@ -218,18 +222,18 @@
         return ret;
     }
 
-    private ArrayList<String> convertSimToSms(SmsMessage message) {
+    private ArrayList<String> convertIccToSms(SmsMessage message) {
         ArrayList result = new ArrayList();
 
         // N.B.: These calls must appear in the same order as the
-        // columns appear in SIM_COLUMNS.
+        // columns appear in ICC_COLUMNS.
         result.add(message.getServiceCenterAddress());
         result.add(message.getDisplayOriginatingAddress());
-        result.add(message.getMessageClass().toString());
+        result.add(String.valueOf(message.getMessageClass()));
         result.add(message.getDisplayMessageBody());
         result.add(message.getTimestampMillis());
         result.add(Sms.STATUS_NONE);
-        result.add(message.getIndexOnSim());
+        result.add(message.getIndexOnIcc());
         result.add(message.isStatusReportMessage());
         result.add("sms");
         result.add(TextBasedSmsColumns.MESSAGE_TYPE_ALL);
@@ -237,13 +241,13 @@
     }
 
     /**
-     * Return a Cursor containing just one message from the SIM.
+     * Return a Cursor containing just one message from the ICC.
      */
-    private Cursor getSingleMessageFromSim(String messageIndexString) {
+    private Cursor getSingleMessageFromIcc(String messageIndexString) {
         try {
             int messageIndex = Integer.parseInt(messageIndexString);
             SmsManager smsManager = SmsManager.getDefault();
-            ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromSim();
+            ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromIcc();
             ArrayList<ArrayList> singleRow = new ArrayList<ArrayList>();
 
             SmsMessage message = messages.get(messageIndex);
@@ -251,35 +255,34 @@
                 throw new IllegalArgumentException(
                         "Message not retrieved. ID: " + messageIndexString);
             }
-            singleRow.add(convertSimToSms(message));
-            return withSimNotificationUri(
-                    new ArrayListCursor(SIM_COLUMNS, singleRow));
+            singleRow.add(convertIccToSms(message));
+            return withIccNotificationUri(
+                    new ArrayListCursor(ICC_COLUMNS, singleRow));
         } catch (NumberFormatException exception) {
             throw new IllegalArgumentException(
-                    "Bad SMS SIM ID: " + messageIndexString);
+                    "Bad SMS ICC ID: " + messageIndexString);
         }
     }
 
     /**
-     * Return a Cursor listing all the messages stored on the SIM.
+     * Return a Cursor listing all the messages stored on the ICC.
      */
-    private Cursor getAllMessagesFromSim() {
+    private Cursor getAllMessagesFromIcc() {
         SmsManager smsManager = SmsManager.getDefault();
-        ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromSim();
+        ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromIcc();
         ArrayList<ArrayList> rows = new ArrayList<ArrayList>();
 
         for (int count = messages.size(), i = 0; i < count; i++) {
             SmsMessage message = messages.get(i);
             if (message != null) {
-                rows.add(convertSimToSms(message));
+                rows.add(convertIccToSms(message));
             }
         }
-        return withSimNotificationUri(new ArrayListCursor(SIM_COLUMNS, rows));
+        return withIccNotificationUri(new ArrayListCursor(ICC_COLUMNS, rows));
     }
 
-    private Cursor withSimNotificationUri(Cursor cursor) {
-        cursor.setNotificationUri(getContext().getContentResolver(),
-                                  SIM_URI);
+    private Cursor withIccNotificationUri(Cursor cursor) {
+        cursor.setNotificationUri(getContext().getContentResolver(), ICC_URI);
         return cursor;
     }
 
@@ -522,10 +525,10 @@
                 count = db.delete("sr_pending", where, whereArgs);
                 break;
 
-            case SMS_SIM:
+            case SMS_ICC:
                 String messageIndexString = url.getPathSegments().get(1);
 
-                return deleteMessageFromSim(messageIndexString);
+                return deleteMessageFromIcc(messageIndexString);
 
             default:
                 throw new IllegalArgumentException("Unknown URL");
@@ -538,23 +541,23 @@
     }
 
     /**
-     * Delete the message at index from SIM.  Return true iff
+     * Delete the message at index from ICC.  Return true iff
      * successful.
      */
-    private int deleteMessageFromSim(String messageIndexString) {
+    private int deleteMessageFromIcc(String messageIndexString) {
         SmsManager smsManager = SmsManager.getDefault();
 
         try {
-            return smsManager.deleteMessageFromSim(
+            return smsManager.deleteMessageFromIcc(
                     Integer.parseInt(messageIndexString))
                     ? 1 : 0;
         } catch (NumberFormatException exception) {
             throw new IllegalArgumentException(
-                    "Bad SMS SIM ID: " + messageIndexString);
+                    "Bad SMS ICC ID: " + messageIndexString);
         } finally {
             ContentResolver cr = getContext().getContentResolver();
 
-            cr.notifyChange(SIM_URI, null);
+            cr.notifyChange(ICC_URI, null);
         }
     }
 
@@ -668,8 +671,8 @@
     private static final int SMS_QUERY_THREAD_ID = 19;
     private static final int SMS_STATUS_ID = 20;
     private static final int SMS_STATUS_PENDING = 21;
-    private static final int SMS_ALL_SIM = 22;
-    private static final int SMS_SIM = 23;
+    private static final int SMS_ALL_ICC = 22;
+    private static final int SMS_ICC = 23;
     private static final int SMS_FAILED = 24;
     private static final int SMS_FAILED_ID = 25;
     private static final int SMS_QUEUED = 26;
@@ -702,9 +705,12 @@
         sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
         sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
         sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
-        sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM);
-        sURLMatcher.addURI("sms", "sim/#", SMS_SIM);
-
+        sURLMatcher.addURI("sms", "icc", SMS_ALL_ICC);
+        sURLMatcher.addURI("sms", "icc/#", SMS_ICC);
+        //we keep these for not breaking old applications
+        sURLMatcher.addURI("sms", "sim", SMS_ALL_ICC);
+        sURLMatcher.addURI("sms", "sim/#", SMS_ICC);
+        
         sConversationProjectionMap.put(Sms.Conversations.SNIPPET,
                 "body AS snippet");
         sConversationProjectionMap.put("delta", null);
