diff --git a/res/values/strings.xml b/res/values/strings.xml
index c5d1c23..2825a7e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -371,8 +371,8 @@
     </string-array>
     <!-- Mobile network settings screen, data enabling checkbox name -->
     <string name="data_enabled">Data enabled</string>
-    <!-- Mobile network settings screen, setting summary text when check box is not selected (explains what selecting it would do) -->
-    <string name="data_enable_summary">Enable data access over Cellular network</string>
+    <!-- Mobile network settings screen, setting summary text when check box is not selected (explains what selecting it would do) [CHAR LIMITS=40] -->
+    <string name="data_enable_summary">Allow data usage</string>
     <!-- Mobile network settings screen, setting check box name -->
     <string name="roaming">Data roaming</string>
     <!-- Mobile network settings screen, setting summary text when check box is selected -->
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 2590aa4..5e8c9f5 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -1177,14 +1177,16 @@
      * @throws SecurityException if the caller does not have the required permission/privilege
      */
     private void enforceModifyPermissionOrCarrierPrivilege() {
-        try {
-          mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
-        } catch (SecurityException e) {
-            log("No modify permission, check carrier privilege next.");
-            if (hasCarrierPrivileges() != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
-              loge("No Carrier Privilege.");
-              throw new SecurityException("No modify permission or carrier privilege.");
-            }
+        int permission = mApp.checkCallingOrSelfPermission(
+                android.Manifest.permission.MODIFY_PHONE_STATE);
+        if (permission == PackageManager.PERMISSION_GRANTED) {
+            return;
+        }
+
+        log("No modify permission, check carrier privilege next.");
+        if (hasCarrierPrivileges() != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+            loge("No Carrier Privilege.");
+            throw new SecurityException("No modify permission or carrier privilege.");
         }
     }
 
@@ -1195,8 +1197,8 @@
      */
     private void enforceCarrierPrivilege() {
         if (hasCarrierPrivileges() != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
-          loge("No Carrier Privilege.");
-          throw new SecurityException("No Carrier Privilege.");
+            loge("No Carrier Privilege.");
+            throw new SecurityException("No Carrier Privilege.");
         }
     }
 
@@ -1679,47 +1681,14 @@
 
     @Override
     public int hasCarrierPrivileges() {
-        PackageManager packageManager = mPhone.getContext().getPackageManager();
-        String[] packages = packageManager.getPackagesForUid(Binder.getCallingUid());
-
-        for (String pkg : packages) {
-            try {
-                PackageInfo pInfo = packageManager.getPackageInfo(pkg,
-                    PackageManager.GET_SIGNATURES);
-                Signature[] signatures = pInfo.signatures;
-                for (Signature sig : signatures) {
-                    int hasAccess = UiccController.getInstance().getUiccCard().hasCarrierPrivileges(
-                            sig, pInfo.packageName);
-                    if (hasAccess != TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS) {
-                        return hasAccess;
-                    }
-                }
-            } catch (PackageManager.NameNotFoundException ex) {
-                loge("NameNotFoundException: " + ex);
-                continue;
-            }
-        }
-        return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
+        return UiccController.getInstance().getUiccCard().getCarrierPrivilegeStatusForCurrentTransaction(
+                mPhone.getContext().getPackageManager());
     }
 
     @Override
     public int checkCarrierPrivilegesForPackage(String pkgname) {
-        PackageManager packageManager = mPhone.getContext().getPackageManager();
-        try {
-            PackageInfo pInfo = packageManager.getPackageInfo(pkgname,
-                PackageManager.GET_SIGNATURES);
-            Signature[] signatures = pInfo.signatures;
-            for (Signature sig : signatures) {
-                int hasAccess = UiccController.getInstance().getUiccCard().hasCarrierPrivileges(
-                        sig, pInfo.packageName);
-                if (hasAccess != TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS) {
-                    return hasAccess;
-                }
-            }
-        } catch (PackageManager.NameNotFoundException ex) {
-            loge("NameNotFoundException: " + ex);
-        }
-        return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
+        return UiccController.getInstance().getUiccCard().getCarrierPrivilegeStatus(
+                mPhone.getContext().getPackageManager(), pkgname);
     }
 
     @Override
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 626244e..2d55165 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -19,6 +19,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.net.Uri;
+import android.os.Debug;
 import android.telephony.DisconnectCause;
 import android.telephony.ServiceState;
 import android.text.TextUtils;
@@ -184,7 +185,7 @@
 
         if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
             response.onSuccess(telephonyRequest, new GsmConnection(originalConnection));
-        } else if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
+        } else if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
             response.onSuccess(telephonyRequest, new CdmaConnection(originalConnection));
         } else {
             response.onCancel(request);
@@ -239,9 +240,11 @@
 
         if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
             response.onSuccess(telephonyRequest, new GsmConnection(originalConnection));
-        } else if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
+        } else if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
             response.onSuccess(telephonyRequest, new CdmaConnection(originalConnection));
         } else {
+            // TODO(ihab): Tear down 'originalConnection' here, or move recognition of
+            // getPhoneType() earlier in this method before we've already asked phone to dial()
             response.onFailure(request, DisconnectCause.ERROR_UNSPECIFIED, "Invalid phone type");
         }
     }
