Merge "DO NOT MERGE: Almost all warnings are now errors in RS build." into honeycomb-mr1
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 26f375d..cab8ed2 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -221,32 +221,12 @@
 
     /** {@hide} */
     public static final int TYPE_DUMMY       = 8;
-
     /** {@hide} */
     public static final int TYPE_ETHERNET    = 9;
-    /**
-     * Over the air Adminstration.
-     * {@hide}
-     */
-    public static final int TYPE_MOBILE_FOTA = 10;
-
-    /**
-     * IP Multimedia Subsystem
-     * {@hide}
-     */
-    public static final int TYPE_MOBILE_IMS  = 11;
-
-    /**
-     * Carrier Branded Services
-     * {@hide}
-     */
-    public static final int TYPE_MOBILE_CBS  = 12;
-
-    /** {@hide} */
-    public static final int MAX_RADIO_TYPE   = TYPE_MOBILE_CBS;
-
-    /** {@hide} */
-    public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_CBS;
+    /** {@hide} TODO: Need to adjust this for WiMAX. */
+    public static final int MAX_RADIO_TYPE   = TYPE_DUMMY;
+    /** {@hide} TODO: Need to adjust this for WiMAX. */
+    public static final int MAX_NETWORK_TYPE = TYPE_DUMMY;
 
     public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
 
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index 5b4da66..e04964e 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -437,8 +437,7 @@
                 retValue = true;
                 break;
             case Phone.APN_REQUEST_STARTED:
-                // set IDLE here , avoid the following second FAILED not sent out
-                mNetworkInfo.setDetailedState(DetailedState.IDLE, null, null);
+                // no need to do anything - we're already due some status update intents
                 retValue = true;
                 break;
             case Phone.APN_REQUEST_FAILED:
@@ -547,12 +546,6 @@
                 return Phone.APN_TYPE_DUN;
             case ConnectivityManager.TYPE_MOBILE_HIPRI:
                 return Phone.APN_TYPE_HIPRI;
-            case ConnectivityManager.TYPE_MOBILE_FOTA:
-                return Phone.APN_TYPE_FOTA;
-            case ConnectivityManager.TYPE_MOBILE_IMS:
-                return Phone.APN_TYPE_IMS;
-            case ConnectivityManager.TYPE_MOBILE_CBS:
-                return Phone.APN_TYPE_CBS;
             default:
                 sloge("Error mapping networkType " + netType + " to apnType.");
                 return null;
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index d2d2557..62f66b6 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -1723,14 +1723,6 @@
 
         public static final String TYPE = "type";
 
-        public static final String INACTIVE_TIMER = "inactivetimer";
-
-        // Only if enabled try Data Connection.
-        public static final String ENABLED = "enabled";
-
-        // Rules apply based on class.
-        public static final String CLASS = "class";
-
         /**
          * The protocol to be used to connect to this APN.
          *
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index c815758..e46eecc 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -51,11 +51,6 @@
          manager will disable alpha trasformation in animations where not
          strictly needed. -->
     <bool name="config_sf_limitedAlpha">false</bool>
-
-    <!-- Default value used to block data calls if ims is not
-         connected.  If you use the ims apn DCT will block
-         any other apn from connecting until ims apn is connected-->
-    <bool name="ImsConnectedDefaultValue">false</bool>
     
     <!-- Flag indicating whether the surface flinger is inefficient
          at performing a blur.  Used by parts of the UI to turn off
@@ -138,9 +133,6 @@
         <item>"mobile_mms,2,0,2"</item>
         <item>"mobile_supl,3,0,2"</item>
         <item>"mobile_hipri,5,0,3"</item>
-        <item>"mobile_fota,8,0,2"</item>
-        <item>"mobile_ims,9,0,2"</item>
-        <item>"mobile_cbs,10,0,2"</item>
     </string-array>
 
     <!-- This string array should be overridden by the device to present a list of radio
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4g.png
deleted file mode 100644
index 84ac927..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 826ac92..0273a4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -246,16 +246,6 @@
               R.drawable.stat_sys_data_fully_out_3g,
               R.drawable.stat_sys_data_fully_inandout_3g }
         };
-    private static final int[][] sDataNetType_4g = {
-            { R.drawable.stat_sys_data_connected_4g,
-              R.drawable.stat_sys_data_in_4g,
-              R.drawable.stat_sys_data_out_4g,
-              R.drawable.stat_sys_data_inandout_4g },
-            { R.drawable.stat_sys_data_fully_connected_4g,
-              R.drawable.stat_sys_data_fully_in_4g,
-              R.drawable.stat_sys_data_fully_out_4g,
-              R.drawable.stat_sys_data_fully_inandout_4g }
-        };
     private static final int[][] sDataNetType_e = {
             { R.drawable.stat_sys_data_connected_e,
               R.drawable.stat_sys_data_in_e,
@@ -680,12 +670,9 @@
         case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
         case TelephonyManager.NETWORK_TYPE_EVDO_A:
         case TelephonyManager.NETWORK_TYPE_EVDO_B:
-        case TelephonyManager.NETWORK_TYPE_EHRPD:
             mDataIconList = sDataNetType_3g[mInetCondition];
             break;
-        case TelephonyManager.NETWORK_TYPE_LTE:
-            mDataIconList = sDataNetType_4g[mInetCondition];
-            break;
+        // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
         default:
             mDataIconList = sDataNetType_g[mInetCondition];
         break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 326cd74..b17e41b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -428,14 +428,10 @@
             case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
             case TelephonyManager.NETWORK_TYPE_EVDO_A:
             case TelephonyManager.NETWORK_TYPE_EVDO_B:
-            case TelephonyManager.NETWORK_TYPE_EHRPD:
                 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
                 mDataTypeIconId = R.drawable.stat_sys_signal_3g;
                 break;
-            case TelephonyManager.NETWORK_TYPE_LTE:
-                mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
-                mDataTypeIconId = R.drawable.stat_sys_signal_4g;
-                break;
+            // TODO - add support for NETWORK_TYPE_LTE and NETWORK_TYPE_EHRPD
             default:
                 mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
                 mDataTypeIconId = R.drawable.stat_sys_signal_gprs;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 9093b3e..29d35e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -124,18 +124,5 @@
               R.drawable.stat_sys_data_fully_inandout_1x }
             };
 
-    // LTE and eHRPD
-    static final int[][] DATA_4G = {
-            { R.drawable.stat_sys_data_connected_4g,
-              R.drawable.stat_sys_data_in_4g,
-              R.drawable.stat_sys_data_out_4g,
-              R.drawable.stat_sys_data_inandout_4g },
-            { R.drawable.stat_sys_data_fully_connected_4g,
-              R.drawable.stat_sys_data_fully_in_4g,
-              R.drawable.stat_sys_data_fully_out_4g,
-              R.drawable.stat_sys_data_fully_inandout_4g }
-        };
-
-
 }
 
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index b7d0a8f..14a6b96 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -696,10 +696,15 @@
         // TODO - move this into the MobileDataStateTracker
         int usedNetworkType = networkType;
         if(networkType == ConnectivityManager.TYPE_MOBILE) {
-            usedNetworkType = convertFeatureToNetworkType(feature);
-            if (usedNetworkType < 0) {
-                Slog.e(TAG, "Can't match any netTracker!");
-                usedNetworkType = networkType;
+            if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
+                usedNetworkType = ConnectivityManager.TYPE_MOBILE_MMS;
+            } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
+                usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL;
+            } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
+                    TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
+                usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;
+            } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
+                usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
             }
         }
         NetworkStateTracker network = mNetTrackers[usedNetworkType];
@@ -843,9 +848,15 @@
             // TODO - move to MobileDataStateTracker
             int usedNetworkType = networkType;
             if (networkType == ConnectivityManager.TYPE_MOBILE) {
-                usedNetworkType = convertFeatureToNetworkType(feature);
-                if (usedNetworkType < 0) {
-                    usedNetworkType = networkType;
+                if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
+                    usedNetworkType = ConnectivityManager.TYPE_MOBILE_MMS;
+                } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
+                    usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL;
+                } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
+                        TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
+                    usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;
+                } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
+                    usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
                 }
             }
             tracker =  mNetTrackers[usedNetworkType];
@@ -2163,24 +2174,4 @@
     private void loge(String s) {
         Slog.e(TAG, s);
     }
-    int convertFeatureToNetworkType(String feature){
-        int networkType = -1;
-        if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_MMS;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_SUPL;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) ||
-                TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN_ALWAYS)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_DUN;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_HIPRI;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_FOTA)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_FOTA;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_IMS)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_IMS;
-        } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_CBS)) {
-            networkType = ConnectivityManager.TYPE_MOBILE_CBS;
-        }
-        return networkType;
-    }
 }
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 5dcb820..290f2c1 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -91,10 +91,6 @@
     public static final int RADIO_TECHNOLOGY_HSPA = 11;
     /** @hide */
     public static final int RADIO_TECHNOLOGY_EVDO_B = 12;
-    /** @hide */
-    public static final int RADIO_TECHNOLOGY_LTE = 13;
-    /** @hide */
-    public static final int RADIO_TECHNOLOGY_EHRPD = 14;
 
     /**
      * Available registration states for GSM, UMTS and CDMA.
@@ -428,12 +424,6 @@
         case 12:
             radioTechnology = "EvDo rev. B";
             break;
-        case 13:
-            radioTechnology = "LTE";
-            break;
-        case 14:
-            radioTechnology = "eHRPD";
-            break;
         default:
             Log.w(LOG_TAG, "mRadioTechnology variable out of range.");
         break;
diff --git a/telephony/java/com/android/internal/telephony/ApnContext.java b/telephony/java/com/android/internal/telephony/ApnContext.java
deleted file mode 100644
index bd1bc1d..0000000
--- a/telephony/java/com/android/internal/telephony/ApnContext.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2006 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.internal.telephony;
-
-import android.app.PendingIntent;
-
-import android.util.Log;
-import java.util.ArrayList;
-import com.android.internal.telephony.gsm.GsmDataConnection;
-
-/**
- * Maintain the Apn context
- */
-public class ApnContext {
-
-    public static final int PENDING_ACTION_NONE = 1;
-    public static final int PENDING_ACTION_RECONNECT = 2;
-    public static final int PENDING_ACTION_APN_DISABLE = 3;
-    public final String LOG_TAG;
-
-    int pendingAction;
-
-    protected static final boolean DBG = true;
-
-    String mApnType;
-
-    DataConnectionTracker.State mState;
-
-    ArrayList<ApnSetting> mWaitingApns = null;
-
-    private int mWaitingApnsPermanentFailureCountDown = 0;
-
-    ApnSetting mApnSetting;
-
-    GsmDataConnection mDataConnection;
-
-    String mReason;
-
-    PendingIntent mReconnectIntent;
-
-    public ApnContext(String apnType, String logTag) {
-        mApnType = apnType;
-        mState = DataConnectionTracker.State.IDLE;
-        setReason(Phone.REASON_DATA_ENABLED);
-        pendingAction = PENDING_ACTION_NONE;
-        LOG_TAG = logTag;
-    }
-
-    public int getPendingAction() {
-        return pendingAction;
-    }
-
-    public void setPendingAction(int pa) {
-        pendingAction = pa;
-    }
-
-    public int getPermFailCount() {
-        return mWaitingApnsPermanentFailureCountDown;
-    }
-
-    public void decPermFailCount() {
-        mWaitingApnsPermanentFailureCountDown--;
-    }
-
-    public String getApnType() {
-        return mApnType;
-    }
-
-    public GsmDataConnection getDataConnection() {
-        return mDataConnection;
-    }
-
-    public void setDataConnection(GsmDataConnection dataConnection) {
-        mDataConnection = dataConnection;
-    }
-
-    public ApnSetting getApnSetting() {
-        return mApnSetting;
-    }
-
-    public void setApnSetting(ApnSetting apnSetting) {
-        mApnSetting = apnSetting;
-    }
-
-    public void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
-        mWaitingApns = waitingApns;
-    }
-
-    public ApnSetting getNextApn() {
-        ArrayList<ApnSetting> list = mWaitingApns;
-        ApnSetting apn = null;
-
-        if (list != null) {
-            if (!list.isEmpty()) {
-                apn = list.get(0);
-            }
-        }
-        return apn;
-    }
-
-    public void removeNextApn() {
-        if ((mWaitingApns != null) && (!mWaitingApns.isEmpty())) {
-            mWaitingApns.remove(0);
-        }
-    }
-
-    public ArrayList<ApnSetting> getWaitingApns() {
-        return mWaitingApns;
-    }
-
-    public void setState(DataConnectionTracker.State s) {
-        if (DBG)
-            log("setState: " + s + " for type " + mApnType + ", previous state:" + mState);
-
-        mState = s;
-
-        if (mState == DataConnectionTracker.State.FAILED) {
-            if (mWaitingApns != null)
-                mWaitingApns.clear(); // when teardown the connection and set to IDLE
-        }
-    }
-
-    public DataConnectionTracker.State getState() {
-        return mState;
-    }
-
-    public void setReason(String reason) {
-        if (DBG)
-            log("set reason as " + reason + ", for type " + mApnType + ",current state " + mState);
-        mReason = reason;
-    }
-
-    public String getReason() {
-        return mReason;
-    }
-
-    public void setReconnectIntent(PendingIntent intent) {
-        if (DBG)
-            log("set ReconnectIntent for type " + mApnType);
-        mReconnectIntent = intent;
-    }
-
-    public PendingIntent getReconnectIntent() {
-        return mReconnectIntent;
-    }
-
-    protected void log(String s) {
-        Log.d(LOG_TAG, "[ApnContext] " + s);
-    }
-}
diff --git a/telephony/java/com/android/internal/telephony/ApnSetting.java b/telephony/java/com/android/internal/telephony/ApnSetting.java
index 3c93a68..20dbaf3 100644
--- a/telephony/java/com/android/internal/telephony/ApnSetting.java
+++ b/telephony/java/com/android/internal/telephony/ApnSetting.java
@@ -38,17 +38,12 @@
     public String numeric;
     public String protocol;
     public String roamingProtocol;
-    public boolean enabled;
-
-    int timer;
-    int apnclass;
 
     public ApnSetting(int id, String numeric, String carrier, String apn,
             String proxy, String port,
             String mmsc, String mmsProxy, String mmsPort,
             String user, String password, int authType, String[] types,
-            String protocol, String roamingProtocol,
-            boolean enabled, int timer, int apnclass) {
+            String protocol, String roamingProtocol) {
         this.id = id;
         this.numeric = numeric;
         this.carrier = carrier;
@@ -64,9 +59,6 @@
         this.types = types;
         this.protocol = protocol;
         this.roamingProtocol = roamingProtocol;
-        this.enabled = enabled;
-        this.timer = timer;
-        this.apnclass = apnclass;
     }
 
     /**
@@ -85,7 +77,7 @@
      * v2 format:
      *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
      *   <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>,
-     *   <type>[| <type>...], <protocol>, <roaming_protocol>, <enabled>, <timer>, <apnclass>
+     *   <type>[| <type>...], <protocol>, <roaming_protocol>
      *
      * Note that the strings generated by toString() do not contain the username
      * and password and thus cannot be read by this method.
@@ -118,16 +110,11 @@
 
         String[] typeArray;
         String protocol, roamingProtocol;
-        boolean enabled;
-        int timer, apnclass;
         if (version == 1) {
             typeArray = new String[a.length - 13];
             System.arraycopy(a, 13, typeArray, 0, a.length - 13);
             protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
             roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
-            enabled = true;
-            timer = 0;
-            apnclass = 0;
         } else {
             if (a.length < 16) {
                 return null;
@@ -135,14 +122,10 @@
             typeArray = a[13].split("\\s*\\|\\s*");
             protocol = a[14];
             roamingProtocol = a[15];
-            enabled = Integer.parseInt(a[16]) != 0;
-            timer = Integer.parseInt(a[17]);
-            apnclass = Integer.parseInt(a[18]);
         }
 
         return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
-                a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,
-                enabled,timer,apnclass);
+                a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol);
     }
 
     public String toString() {
@@ -166,9 +149,6 @@
         }
         sb.append(", ").append(protocol);
         sb.append(", ").append(roamingProtocol);
-        sb.append(", ").append(enabled);
-        sb.append(", ").append(timer);
-        sb.append(", ").append(apnclass);
         return sb.toString();
     }
 
diff --git a/telephony/java/com/android/internal/telephony/BaseCommands.java b/telephony/java/com/android/internal/telephony/BaseCommands.java
index 0fc81b0..9b19600 100644
--- a/telephony/java/com/android/internal/telephony/BaseCommands.java
+++ b/telephony/java/com/android/internal/telephony/BaseCommands.java
@@ -34,9 +34,6 @@
     //***** Instance Variables
     protected Context mContext;
     protected RadioState mState = RadioState.RADIO_UNAVAILABLE;
-    protected RadioState mSimState = RadioState.RADIO_UNAVAILABLE;
-    protected RadioState mRuimState = RadioState.RADIO_UNAVAILABLE;
-    protected RadioState mNvState = RadioState.RADIO_UNAVAILABLE;
     protected Object mStateMonitor = new Object();
 
     protected RegistrantList mRadioStateChangedRegistrants = new RegistrantList();
@@ -108,18 +105,6 @@
         return mState;
     }
 
-    public RadioState getSimState() {
-        return mSimState;
-    }
-
-    public RadioState getRuimState() {
-        return mRuimState;
-    }
-
-    public RadioState getNvState() {
-        return mNvState;
-    }
-
 
     public void registerForRadioStateChanged(Handler h, int what, Object obj) {
         Registrant r = new Registrant (h, what, obj);
@@ -215,7 +200,7 @@
         synchronized (mStateMonitor) {
             mSIMReadyRegistrants.add(r);
 
-            if (mSimState.isSIMReady()) {
+            if (mState.isSIMReady()) {
                 r.notifyRegistrant(new AsyncResult(null, null, null));
             }
         }
@@ -234,7 +219,7 @@
         synchronized (mStateMonitor) {
             mRUIMReadyRegistrants.add(r);
 
-            if (mRuimState.isRUIMReady()) {
+            if (mState.isRUIMReady()) {
                 r.notifyRegistrant(new AsyncResult(null, null, null));
             }
         }
@@ -253,7 +238,7 @@
         synchronized (mStateMonitor) {
             mNVReadyRegistrants.add(r);
 
-            if (mNvState.isNVReady()) {
+            if (mState.isNVReady()) {
                 r.notifyRegistrant(new AsyncResult(null, null, null));
             }
         }
@@ -271,7 +256,7 @@
         synchronized (mStateMonitor) {
             mSIMLockedRegistrants.add(r);
 
-            if (mSimState == RadioState.SIM_LOCKED_OR_ABSENT) {
+            if (mState == RadioState.SIM_LOCKED_OR_ABSENT) {
                 r.notifyRegistrant(new AsyncResult(null, null, null));
             }
         }
@@ -289,7 +274,7 @@
         synchronized (mStateMonitor) {
             mRUIMLockedRegistrants.add(r);
 
-            if (mRuimState == RadioState.RUIM_LOCKED_OR_ABSENT) {
+            if (mState == RadioState.RUIM_LOCKED_OR_ABSENT) {
                 r.notifyRegistrant(new AsyncResult(null, null, null));
             }
         }
@@ -668,22 +653,6 @@
                 return;
             }
 
-            // FIXME: Use Constants or Enums
-            if(mState.getType() == 0) {
-                mSimState = mState;
-                mRuimState = mState;
-                mNvState = mState;
-            }
-            else if (mState.getType() == 1) {
-                mSimState = mState;
-            }
-            else if (mState.getType() == 2) {
-                mRuimState = mState;
-            }
-            else if (mState.getType() == 3) {
-                mNvState = mState;
-            }
-
             mRadioStateChangedRegistrants.notifyRegistrants();
 
             if (mState.isAvailable() && !oldState.isAvailable()) {
diff --git a/telephony/java/com/android/internal/telephony/CallTracker.java b/telephony/java/com/android/internal/telephony/CallTracker.java
index 31f9e18..9619a66 100644
--- a/telephony/java/com/android/internal/telephony/CallTracker.java
+++ b/telephony/java/com/android/internal/telephony/CallTracker.java
@@ -119,10 +119,6 @@
 
     //***** Overridden from Handler
     public abstract void handleMessage (Message msg);
-    public abstract void registerForVoiceCallStarted(Handler h, int what, Object obj);
-    public abstract void unregisterForVoiceCallStarted(Handler h);
-    public abstract void registerForVoiceCallEnded(Handler h, int what, Object obj);
-    public abstract void unregisterForVoiceCallEnded(Handler h);
 
     protected abstract void log(String msg);
 
diff --git a/telephony/java/com/android/internal/telephony/CommandsInterface.java b/telephony/java/com/android/internal/telephony/CommandsInterface.java
index ea38543..ad21a18 100644
--- a/telephony/java/com/android/internal/telephony/CommandsInterface.java
+++ b/telephony/java/com/android/internal/telephony/CommandsInterface.java
@@ -20,29 +20,25 @@
 
 import android.os.Message;
 import android.os.Handler;
-import android.os.SystemProperties;
 
 
 /**
  * {@hide}
  */
 public interface CommandsInterface {
-    // TODO: Get rid of mot from property.
-    static final boolean LTE_AVAILABLE_ON_CDMA =
-        SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
     enum RadioState {
-        RADIO_OFF(0),         /* Radio explictly powered off (eg CFUN=0) */
-        RADIO_UNAVAILABLE(0), /* Radio unavailable (eg, resetting or not booted) */
-        SIM_NOT_READY(1),     /* Radio is on, but the SIM interface is not ready */
-        SIM_LOCKED_OR_ABSENT(1),  /* SIM PIN locked, PUK required, network
-                                     personalization, or SIM absent */
-        SIM_READY(1),         /* Radio is on and SIM interface is available */
-        RUIM_NOT_READY(2),    /* Radio is on, but the RUIM interface is not ready */
-        RUIM_READY(2),        /* Radio is on and the RUIM interface is available */
-        RUIM_LOCKED_OR_ABSENT(2), /* RUIM PIN locked, PUK required, network
-                                     personalization locked, or RUIM absent */
-        NV_NOT_READY(3),      /* Radio is on, but the NV interface is not available */
-        NV_READY(3);          /* Radio is on and the NV interface is available */
+        RADIO_OFF,         /* Radio explicitly powered off (e.g. CFUN=0) */
+        RADIO_UNAVAILABLE, /* Radio unavailable (e.g. resetting or not booted) */
+        SIM_NOT_READY,     /* Radio is on, but the SIM interface is not ready */
+        SIM_LOCKED_OR_ABSENT,  /* SIM PIN locked, PUK required, network
+                               personalization, or SIM absent */
+        SIM_READY,         /* Radio is on and SIM interface is available */
+        RUIM_NOT_READY,    /* Radio is on, but the RUIM interface is not ready */
+        RUIM_READY,        /* Radio is on and the RUIM interface is available */
+        RUIM_LOCKED_OR_ABSENT, /* RUIM PIN locked, PUK required, network
+                                  personalization locked, or RUIM absent */
+        NV_NOT_READY,      /* Radio is on, but the NV interface is not available */
+        NV_READY;          /* Radio is on and the NV interface is available */
 
         public boolean isOn() /* and available...*/ {
             return this == SIM_NOT_READY
@@ -54,14 +50,6 @@
                     || this == NV_NOT_READY
                     || this == NV_READY;
         }
-        private int stateType;
-        private RadioState (int type) {
-            stateType = type;
-        }
-
-        public int getType() {
-            return stateType;
-        }
 
         public boolean isAvailable() {
             return this != RADIO_UNAVAILABLE;
@@ -80,25 +68,17 @@
         }
 
         public boolean isGsm() {
-            if (LTE_AVAILABLE_ON_CDMA) {
-                return false;
-            } else {
-                return this == SIM_NOT_READY
-                        || this == SIM_LOCKED_OR_ABSENT
-                        || this == SIM_READY;
-            }
+            return this == SIM_NOT_READY
+                    || this == SIM_LOCKED_OR_ABSENT
+                    || this == SIM_READY;
         }
 
         public boolean isCdma() {
-            if (LTE_AVAILABLE_ON_CDMA) {
-                return true;
-            } else {
-                return this ==  RUIM_NOT_READY
-                        || this == RUIM_READY
-                        || this == RUIM_LOCKED_OR_ABSENT
-                        || this == NV_NOT_READY
-                        || this == NV_READY;
-            }
+            return this ==  RUIM_NOT_READY
+                    || this == RUIM_READY
+                    || this == RUIM_LOCKED_OR_ABSENT
+                    || this == NV_NOT_READY
+                    || this == NV_READY;
         }
     }
 
@@ -173,9 +153,6 @@
     //***** Methods
 
     RadioState getRadioState();
-    RadioState getSimState();
-    RadioState getRuimState();
-    RadioState getNvState();
 
     /**
      * Fires on any RadioState transition
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index 4c1e0cf..7f8485b 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -97,14 +97,14 @@
     protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 12;
     protected static final int EVENT_VOICE_CALL_STARTED = 14;
     protected static final int EVENT_VOICE_CALL_ENDED = 15;
-    protected static final int EVENT_DATA_CONNECTION_DETACHED = 19;
+    protected static final int EVENT_GPRS_DETACHED = 19;
     protected static final int EVENT_LINK_STATE_CHANGED = 20;
     protected static final int EVENT_ROAMING_ON = 21;
     protected static final int EVENT_ROAMING_OFF = 22;
     protected static final int EVENT_ENABLE_NEW_APN = 23;
     protected static final int EVENT_RESTORE_DEFAULT_APN = 24;
     protected static final int EVENT_DISCONNECT_DONE = 25;
-    protected static final int EVENT_DATA_CONNECTION_ATTACHED = 26;
+    protected static final int EVENT_GPRS_ATTACHED = 26;
     protected static final int EVENT_START_NETSTAT_POLL = 27;
     protected static final int EVENT_START_RECOVERY = 28;
     protected static final int EVENT_APN_CHANGED = 29;
@@ -117,8 +117,8 @@
     protected static final int EVENT_RESTART_RADIO = 36;
     protected static final int EVENT_SET_INTERNAL_DATA_ENABLE = 37;
     protected static final int EVENT_RESET_DONE = 38;
+
     public static final int CMD_SET_DATA_ENABLE = 39;
-    public static final int EVENT_CLEAN_UP_ALL_CONNECTIONS = 40;
 
     /***** Constants *****/
 
@@ -128,10 +128,7 @@
     protected static final int APN_SUPL_ID = 2;
     protected static final int APN_DUN_ID = 3;
     protected static final int APN_HIPRI_ID = 4;
-    protected static final int APN_IMS_ID = 5;
-    protected static final int APN_FOTA_ID = 6;
-    protected static final int APN_CBS_ID = 7;
-    protected static final int APN_NUM_TYPES = 8;
+    protected static final int APN_NUM_TYPES = 5;
 
     public static final int DISABLED = 0;
     public static final int ENABLED = 1;
@@ -264,8 +261,15 @@
                 startNetStatPoll();
             } else if (action.equals(getActionIntentReconnectAlarm())) {
                 log("Reconnect alarm. Previous state was " + mState);
-                onActionIntentReconnectAlarm(intent);
 
+                String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
+                if (mState == State.FAILED) {
+                    Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
+                    msg.arg1 = 0; // tearDown is false
+                    msg.obj = reason;
+                    sendMessage(msg);
+                }
+                sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
             } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
                 final android.net.NetworkInfo networkInfo = (NetworkInfo)
                         intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
@@ -283,18 +287,6 @@
         }
     };
 
-    protected void onActionIntentReconnectAlarm(Intent intent) {
-        String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
-        if (mState == State.FAILED) {
-            Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
-            msg.arg1 = 0; // tearDown is false
-            msg.arg2 = 0;
-            msg.obj = reason;
-            sendMessage(msg);
-        }
-        sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
-    }
-
     /**
      * Default constructor
      */
@@ -342,10 +334,22 @@
     }
 
     public State getState() {
-        // TODO: reimplement to use apnType better yet REMOVE.
         return mState;
     }
 
+    public String getStateInString() {
+        switch (mState) {
+            case IDLE:          return "IDLE";
+            case INITING:       return "INIT";
+            case CONNECTING:    return "CING";
+            case SCANNING:      return "SCAN";
+            case CONNECTED:     return "CNTD";
+            case DISCONNECTING: return "DING";
+            case FAILED:        return "FAIL";
+            default:            return "ERRO";
+        }
+    }
+
     /**
      * @return the data connections
      */
@@ -370,7 +374,7 @@
         return result;
     }
 
-    private String getActiveApnType() {
+    public String getActiveApnType() {
         String result;
         if (mActiveApn != null) {
             result = apnIdToType(mActiveApn.id);
@@ -380,7 +384,7 @@
         return result;
     }
 
-    public String getActiveApnString() {
+    protected String getActiveApnString() {
         String result = null;
         if (mActiveApn != null) {
             result = mActiveApn.apn;
@@ -388,6 +392,17 @@
         return result;
     }
 
+    /**
+     * The data connection is expected to be setup while device
+     *  1. has Icc card
+     *  2. registered for data service
+     *  3. user doesn't explicitly disable data service
+     *  4. wifi is not on
+     *
+     * @return false while no data connection if all above requirements are met.
+     */
+    public abstract boolean isDataConnectionAsDesired();
+
     //The data roaming setting is now located in the shared preferences.
     //  See if the requested preference value is the same as that stored in
     //  the shared values.  If it is not, then update it.
@@ -428,8 +443,7 @@
     protected abstract void onResetDone(AsyncResult ar);
     protected abstract void onVoiceCallStarted();
     protected abstract void onVoiceCallEnded();
-    protected abstract void onCleanUpConnection(boolean tearDown, int apnId, String reason);
-    protected abstract void onCleanUpAllConnections();
+    protected abstract void onCleanUpConnection(boolean tearDown, String reason);
 
     @Override
     public void handleMessage(Message msg) {
@@ -484,15 +498,11 @@
                 onVoiceCallEnded();
                 break;
 
-            case EVENT_CLEAN_UP_ALL_CONNECTIONS: {
-                onCleanUpAllConnections();
-                break;
-            }
-            case EVENT_CLEAN_UP_CONNECTION: {
+            case EVENT_CLEAN_UP_CONNECTION:
                 boolean tearDown = (msg.arg1 == 0) ? false : true;
-                onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj);
+                onCleanUpConnection(tearDown, (String) msg.obj);
                 break;
-            }
+
             case EVENT_SET_INTERNAL_DATA_ENABLE: {
                 boolean enabled = (msg.arg1 == ENABLED) ? true : false;
                 onSetInternalDataEnabled(enabled);
@@ -547,12 +557,6 @@
             return APN_DUN_ID;
         } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) {
             return APN_HIPRI_ID;
-        } else if (TextUtils.equals(type, Phone.APN_TYPE_IMS)) {
-            return APN_IMS_ID;
-        } else if (TextUtils.equals(type, Phone.APN_TYPE_FOTA)) {
-            return APN_FOTA_ID;
-        } else if (TextUtils.equals(type, Phone.APN_TYPE_CBS)) {
-            return APN_CBS_ID;
         } else {
             return APN_INVALID_ID;
         }
@@ -570,12 +574,6 @@
             return Phone.APN_TYPE_DUN;
         case APN_HIPRI_ID:
             return Phone.APN_TYPE_HIPRI;
-        case APN_IMS_ID:
-            return Phone.APN_TYPE_IMS;
-        case APN_FOTA_ID:
-            return Phone.APN_TYPE_FOTA;
-        case APN_CBS_ID:
-            return Phone.APN_TYPE_CBS;
         default:
             log("Unknown id (" + id + ") in apnIdToType");
             return Phone.APN_TYPE_DEFAULT;
@@ -828,7 +826,7 @@
                 dataEnabled[apnId] = false;
                 enabledCount--;
                 if (enabledCount == 0) {
-                    onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED);
+                    onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
                 }
 
                 // send the disconnect msg manually, since the normal route wont send
@@ -886,7 +884,7 @@
                     mRetryMgr.resetRetryCount();
                     onTrySetupData(Phone.REASON_DATA_ENABLED);
                 } else {
-                    cleanUpAllConnections();
+                    onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
                 }
             }
         }
@@ -896,17 +894,6 @@
         return mDataEnabled;
     }
 
-    public void cleanUpAllConnections() {
-        Message msg = obtainMessage(EVENT_CLEAN_UP_ALL_CONNECTIONS);
-        sendMessage(msg);
-    }
-
-    public boolean isAnyActiveDataConnections() {
-        // TODO: Remember if there are any connected or
-        // loop asking each DC/APN?
-        return true;
-    }
-
     protected void onSetDataEnabled(boolean enable) {
         boolean prevEnabled = getAnyDataEnabled();
         if (mDataEnabled != enable) {
@@ -920,7 +907,7 @@
                     mRetryMgr.resetRetryCount();
                     onTrySetupData(Phone.REASON_DATA_ENABLED);
                 } else {
-                    onCleanUpConnection(true, APN_DEFAULT_ID, Phone.REASON_DATA_DISABLED);
+                    onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
                 }
             }
         }
diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java
index d9c2e9a..e270ce9 100644
--- a/telephony/java/com/android/internal/telephony/IccCard.java
+++ b/telephony/java/com/android/internal/telephony/IccCard.java
@@ -28,7 +28,6 @@
 
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.CommandsInterface.RadioState;
-import android.os.SystemProperties;
 
 /**
  * {@hide}
@@ -86,10 +85,6 @@
     private static final int EVENT_QUERY_FACILITY_FDN_DONE = 10;
     private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 11;
 
-    // FIXME: remove mot from property
-    static final boolean LTE_AVAILABLE_ON_CDMA =
-        SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
-
     /*
       UNKNOWN is a transient state, for example, after uesr inputs ICC pin under
       PIN_REQUIRED state, the query for ICC status returns UNKNOWN before it
@@ -431,9 +426,6 @@
             broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED,
                   INTENT_VALUE_LOCKED_NETWORK);
         }
-        if (oldState != State.READY && newState == State.READY && LTE_AVAILABLE_ON_CDMA) {
-            mPhone.mSIMRecords.onSimReady();
-        }
     }
 
     /**
@@ -620,16 +612,14 @@
             currentRadioState == RadioState.SIM_NOT_READY     ||
             currentRadioState == RadioState.RUIM_NOT_READY    ||
             currentRadioState == RadioState.NV_NOT_READY      ||
-            (currentRadioState == RadioState.NV_READY && !LTE_AVAILABLE_ON_CDMA)) {
+            currentRadioState == RadioState.NV_READY) {
             return IccCard.State.NOT_READY;
         }
 
         if( currentRadioState == RadioState.SIM_LOCKED_OR_ABSENT  ||
             currentRadioState == RadioState.SIM_READY             ||
             currentRadioState == RadioState.RUIM_LOCKED_OR_ABSENT ||
-            currentRadioState == RadioState.RUIM_READY ||
-            (currentRadioState == RadioState.NV_READY && LTE_AVAILABLE_ON_CDMA)) {
-
+            currentRadioState == RadioState.RUIM_READY) {
 
             int index;
 
diff --git a/telephony/java/com/android/internal/telephony/IccCardApplication.java b/telephony/java/com/android/internal/telephony/IccCardApplication.java
index 4cf21ee..9f60a6c 100644
--- a/telephony/java/com/android/internal/telephony/IccCardApplication.java
+++ b/telephony/java/com/android/internal/telephony/IccCardApplication.java
@@ -28,8 +28,7 @@
         APPTYPE_SIM,
         APPTYPE_USIM,
         APPTYPE_RUIM,
-        APPTYPE_CSIM,
-        APPTYPE_ISIM
+        APPTYPE_CSIM
     };
 
     public enum AppState{
@@ -116,7 +115,6 @@
             case 2: newType = AppType.APPTYPE_USIM;    break;
             case 3: newType = AppType.APPTYPE_RUIM;    break;
             case 4: newType = AppType.APPTYPE_CSIM;    break;
-            case 5: newType = AppType.APPTYPE_ISIM;    break;
             default:
                 throw new RuntimeException(
                             "Unrecognized RIL_AppType: " +type);
diff --git a/telephony/java/com/android/internal/telephony/IccConstants.java b/telephony/java/com/android/internal/telephony/IccConstants.java
index b40f945..b12d2d4 100644
--- a/telephony/java/com/android/internal/telephony/IccConstants.java
+++ b/telephony/java/com/android/internal/telephony/IccConstants.java
@@ -58,13 +58,6 @@
     static final int EF_CST = 0x6f32;
     static final int EF_RUIM_SPN =0x6F41;
 
-    //ISIM access
-    static final int EF_IMPU = 0x6f04;
-    static final int EF_IMPI = 0x6f02;
-    static final int EF_DOMAIN = 0x6f03;
-    static final int EF_IST = 0x6f07;
-    static final int EF_PCSCF = 0x6f09;
-
     // SMS record length from TS 51.011 10.5.3
     static public final int SMS_RECORD_LENGTH = 176;
 
@@ -74,7 +67,4 @@
     static final String DF_GRAPHICS = "5F50";
     static final String DF_GSM = "7F20";
     static final String DF_CDMA = "7F25";
-
-    //ISIM access
-    static final String DF_ADFISIM = "7FFF";
 }
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index 7450047..acb86d4 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -125,12 +125,6 @@
     static final String APN_TYPE_DUN = "dun";
     /** APN type for HiPri traffic */
     static final String APN_TYPE_HIPRI = "hipri";
-    /** APN type for FOTA */
-    static final String APN_TYPE_FOTA = "fota";
-    /** APN type for IMS */
-    static final String APN_TYPE_IMS = "ims";
-    /** APN type for CBS */
-    static final String APN_TYPE_CBS = "cbs";
 
     // "Features" accessible through the connectivity manager
     static final String FEATURE_ENABLE_MMS = "enableMMS";
@@ -138,9 +132,6 @@
     static final String FEATURE_ENABLE_DUN = "enableDUN";
     static final String FEATURE_ENABLE_HIPRI = "enableHIPRI";
     static final String FEATURE_ENABLE_DUN_ALWAYS = "enableDUNAlways";
-    static final String FEATURE_ENABLE_FOTA = "enableFOTA";
-    static final String FEATURE_ENABLE_IMS = "enableIMS";
-    static final String FEATURE_ENABLE_CBS = "enableCBS";
 
     /**
      * Return codes for <code>enableApnType()</code>
@@ -149,7 +140,6 @@
     static final int APN_REQUEST_STARTED    = 1;
     static final int APN_TYPE_NOT_AVAILABLE = 2;
     static final int APN_REQUEST_FAILED     = 3;
-    static final int APN_ALREADY_INACTIVE   = 4;
 
 
     /**
@@ -174,7 +164,6 @@
     static final String REASON_PS_RESTRICT_ENABLED = "psRestrictEnabled";
     static final String REASON_PS_RESTRICT_DISABLED = "psRestrictDisabled";
     static final String REASON_SIM_LOADED = "simLoaded";
-    static final String REASON_NW_TYPE_CHANGED = "nwTypeChanged";
 
     // Used for band mode selection methods
     static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
@@ -204,7 +193,6 @@
     int NT_MODE_EVDO_NO_CDMA = RILConstants.NETWORK_MODE_EVDO_NO_CDMA;
     int NT_MODE_GLOBAL       = RILConstants.NETWORK_MODE_GLOBAL;
 
-    int NT_MODE_LTE_ONLY     = RILConstants.NETWORK_MODE_LTE_ONLY;
     int PREFERRED_NT_MODE    = RILConstants.PREFERRED_NETWORK_MODE;
 
 
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index 5408ce9..54341b1 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -38,8 +38,6 @@
 
 import com.android.internal.R;
 import com.android.internal.telephony.test.SimulatedRadioControl;
-import com.android.internal.telephony.gsm.SIMRecords;
-import com.android.internal.telephony.gsm.SimCard;
 
 import java.util.Locale;
 
@@ -118,9 +116,6 @@
     int mCallRingDelay;
     public boolean mIsTheCurrentActivePhone = true;
     boolean mIsVoiceCapable = true;
-    public SIMRecords mSIMRecords;
-    public SimCard mSimCard;
-    public SMSDispatcher mSMS;
 
     /**
      * Set a system property, unless we're in unit test mode
@@ -242,8 +237,7 @@
     public void dispose() {
         synchronized(PhoneProxy.lockForRadioTechnologyChange) {
             mCM.unSetOnCallRing(this);
-            // Must cleanup all connectionS and needs to use sendMessage!
-            mDataConnection.cleanUpAllConnections();
+            mDataConnection.onCleanUpConnection(false, REASON_RADIO_TURNED_OFF);
             mIsTheCurrentActivePhone = false;
         }
     }
@@ -668,20 +662,6 @@
     }
 
     /**
-    * Retrieves the ServiceStateTracker of the phone instance.
-    */
-    public ServiceStateTracker getServiceStateTracker() {
-        return null;
-    }
-
-    /**
-    * Get call tracker
-    */
-    public CallTracker getCallTracker() {
-        return null;
-    }
-
-    /**
      *  Query the status of the CDMA roaming preference
      */
     public void queryCdmaRoamingPreference(Message response) {
@@ -1100,14 +1080,4 @@
         Log.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
                 "called, GSMPhone inactive.");
     }
-
-    // Called by SimRecords which is constructed with a PhoneBase instead of a GSMPhone.
-    public void notifyCallForwardingIndicator() {
-        // This function should be overridden by the class GSMPhone. Not implemented in CDMAPhone.
-        Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
-    }
-
-    public void notifyDataConnectionFailed(String reason, String apnType) {
-        mNotifier.notifyDataConnectionFailed(this, reason, apnType);
-    }
 }
diff --git a/telephony/java/com/android/internal/telephony/PhoneFactory.java b/telephony/java/com/android/internal/telephony/PhoneFactory.java
index c25a53d..2e391cb 100644
--- a/telephony/java/com/android/internal/telephony/PhoneFactory.java
+++ b/telephony/java/com/android/internal/telephony/PhoneFactory.java
@@ -21,10 +21,8 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.util.Log;
-import android.os.SystemProperties;
 
 import com.android.internal.telephony.cdma.CDMAPhone;
-import com.android.internal.telephony.cdma.CDMALTEPhone;
 import com.android.internal.telephony.gsm.GSMPhone;
 import com.android.internal.telephony.sip.SipPhone;
 import com.android.internal.telephony.sip.SipPhoneFactory;
@@ -36,9 +34,6 @@
     static final String LOG_TAG = "PHONE";
     static final int SOCKET_OPEN_RETRY_MILLIS = 2 * 1000;
     static final int SOCKET_OPEN_MAX_RETRY = 3;
-    static final boolean LTE_AVAILABLE_ON_CDMA =
-        SystemProperties.getBoolean("ro.mot.lte_on_cdma", false);
-
     //***** Class Variables
 
     static private Phone sProxyPhone = null;
@@ -120,15 +115,9 @@
                     sProxyPhone = new PhoneProxy(new GSMPhone(context,
                             sCommandsInterface, sPhoneNotifier));
                 } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
-                    if (LTE_AVAILABLE_ON_CDMA == false ) {
-                        Log.i(LOG_TAG, "Creating CDMAPhone");
-                        sProxyPhone = new PhoneProxy(new CDMAPhone(context,
-                                sCommandsInterface, sPhoneNotifier));
-                    } else {
-                        Log.i(LOG_TAG, "Creating CDMALTEPhone");
-                        sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,
-                                sCommandsInterface, sPhoneNotifier));
-                    }
+                    Log.i(LOG_TAG, "Creating CDMAPhone");
+                    sProxyPhone = new PhoneProxy(new CDMAPhone(context,
+                            sCommandsInterface, sPhoneNotifier));
                 }
 
                 sMadeDefaults = true;
@@ -158,13 +147,6 @@
 
         case RILConstants.NETWORK_MODE_GLOBAL:
             return Phone.PHONE_TYPE_CDMA;
-
-        case RILConstants.NETWORK_MODE_LTE_ONLY:
-            if (SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
-                return Phone.PHONE_TYPE_CDMA;
-            } else {
-                return Phone.PHONE_TYPE_GSM;
-            }
         default:
             return Phone.PHONE_TYPE_GSM;
         }
@@ -184,13 +166,8 @@
 
     public static Phone getCdmaPhone() {
         synchronized(PhoneProxy.lockForRadioTechnologyChange) {
-            if (LTE_AVAILABLE_ON_CDMA == false) {
-                Phone phone = new CDMAPhone(sContext, sCommandsInterface, sPhoneNotifier);
-                return phone;
-            } else {
-                Phone phone = new CDMALTEPhone(sContext, sCommandsInterface, sPhoneNotifier);
-                return phone;
-            }
+            Phone phone = new CDMAPhone(sContext, sCommandsInterface, sPhoneNotifier);
+            return phone;
         }
     }
 
diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java
index 49497b4..15b23bb 100644
--- a/telephony/java/com/android/internal/telephony/PhoneProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java
@@ -741,10 +741,6 @@
          return mActivePhone.getCdmaEriIconMode();
     }
 
-    public Phone getActivePhone() {
-         return mActivePhone;
-    }
-
     public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){
         mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete);
     }
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 1d194d0..804ace4 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -638,13 +638,6 @@
             case RILConstants.NETWORK_MODE_GLOBAL:
                 mPhoneType = RILConstants.CDMA_PHONE;
                 break;
-            case RILConstants.NETWORK_MODE_LTE_ONLY:
-                if (SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
-                    mPhoneType = RILConstants.CDMA_PHONE;
-                } else {
-                    mPhoneType = RILConstants.GSM_PHONE;
-                }
-                break;
             default:
                 mPhoneType = RILConstants.CDMA_PHONE;
         }
@@ -2071,14 +2064,6 @@
                  */
                 if (RILJ_LOGD) Log.d(LOG_TAG, "Radio ON @ init; reset to OFF");
                 setRadioPower(false, null);
-                // MultimodeRIL needs to know the preferred network at power up.
-                RILRequest rrPnt = RILRequest.obtain(
-                                   RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, null);
-                rrPnt.mp.writeInt(1);
-                rrPnt.mp.writeInt(mNetworkMode);
-                if (RILJ_LOGD) riljLog(rrPnt.serialString() + "> "
-                        + requestToString(rrPnt.mRequest) + " : " + mNetworkMode);
-                send(rrPnt);
             } else {
                 if (DBG) Log.d(LOG_TAG, "Radio OFF @ init");
                 setRadioState(newState);
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 8c9fb79..cdf1977 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -66,8 +66,6 @@
     int NETWORK_MODE_EVDO_NO_CDMA   = 6; /* EvDo only */
     int NETWORK_MODE_GLOBAL         = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
                                             AVAILABLE Application Settings menu*/
-    int NETWORK_MODE_LTE_ONLY       = 8; /* LTE Only mode. Used only for testing purposes.Not
-                                            user selectable from regular UI */
     int PREFERRED_NETWORK_MODE      = NETWORK_MODE_WCDMA_PREF;
 
     /* CDMA subscription source. See ril.h RIL_REQUEST_CDMA_SET_SUBSCRIPTION */
@@ -140,12 +138,10 @@
     int RIL_RESTRICTED_STATE_PS_ALL = 0x10;
 
     /** Data profile for RIL_REQUEST_SETUP_DATA_CALL */
-    public static final int DATA_PROFILE_DEFAULT   = 0;
-    public static final int DATA_PROFILE_TETHERED  = 1;
-    public static final int DATA_PROFILE_IMS       = 2;
-    public static final int DATA_PROFILE_FOTA      = 3;
-    public static final int DATA_PROFILE_CBS       = 4;
-    public static final int DATA_PROFILE_OEM_BASE  = 1000;
+    static final int DATA_PROFILE_DEFAULT   = 0;
+    static final int DATA_PROFILE_TETHERED  = 1;
+    static final int DATA_PROFILE_OEM_BASE  = 1000;
+
 
     int RIL_REQUEST_GET_SIM_STATUS = 1;
     int RIL_REQUEST_ENTER_SIM_PIN = 2;
diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
index 6af9b1c..befee8c7 100755
--- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
@@ -582,7 +582,7 @@
      *         {@link Activity#RESULT_OK} if the message has been broadcast
      *         to applications
      */
-    public abstract int dispatchMessage(SmsMessageBase sms);
+    protected abstract int dispatchMessage(SmsMessageBase sms);
 
 
     /**
@@ -916,7 +916,7 @@
      * @param response
      *            Callback message is empty on completion
      */
-    public abstract void activateCellBroadcastSms(int activate, Message response);
+    protected abstract void activateCellBroadcastSms(int activate, Message response);
 
     /**
      * Query the current configuration of cell broadcast SMS.
@@ -925,7 +925,7 @@
      *            Callback message contains the configuration from the modem on completion
      *            @see #setCellBroadcastConfig
      */
-    public abstract void getCellBroadcastSmsConfig(Message response);
+    protected abstract void getCellBroadcastSmsConfig(Message response);
 
     /**
      * Configure cell broadcast SMS.
@@ -937,7 +937,7 @@
      * @param response
      *            Callback message is empty on completion
      */
-    public abstract void setCellBroadcastConfig(int[] configValuesArray, Message response);
+    protected abstract void setCellBroadcastConfig(int[] configValuesArray, Message response);
 
     /**
      * Send an acknowledge message.
@@ -1006,27 +1006,6 @@
         return new SmsTracker(data, sentIntent, deliveryIntent);
     }
 
-    public void initSipStack(boolean isObg) {
-        // This function should be overridden by the classes that support
-        // switching modes such as the CdmaSMSDispatcher.
-        // Not implemented in GsmSMSDispatcher.
-        Log.e(TAG, "Error! This function should never be executed.");
-    }
-
-    public void switchToCdma() {
-        // This function should be overridden by the classes that support
-        // switching modes such as the CdmaSMSDispatcher.
-        // Not implemented in GsmSMSDispatcher.
-        Log.e(TAG, "Error! This function should never be executed.");
-    }
-
-    public void switchToGsm() {
-        // This function should be overridden by the classes that support
-        // switching modes such as the CdmaSMSDispatcher.
-        // Not implemented in GsmSMSDispatcher.
-        Log.e(TAG, "Error! This function should never be executed.");
-    }
-
     private DialogInterface.OnClickListener mListener =
         new DialogInterface.OnClickListener() {
 
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index 0acbfe3..3f9ffc3 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -45,8 +45,6 @@
     protected static final int DATA_ACCESS_HSUPA = 10;
     protected static final int DATA_ACCESS_HSPA = 11;
     protected static final int DATA_ACCESS_CDMA_EvDo_B = 12;
-    protected static final int DATA_ACCESS_LTE = 13;
-    protected static final int DATA_ACCESS_EHRPD = 14;
 
     protected CommandsInterface cm;
 
@@ -282,51 +280,12 @@
     protected abstract void setPowerStateToDesired();
     protected abstract void log(String s);
 
-    private void logUnexpectedGsmMethodCall(String name) {
-        log("SSST" + "Error! " + name + "() in ServiceStateTracker should not be " +
-        "called, GsmServiceStateTracker inactive.");
-    }
-
-    public abstract int getCurrentDataConnectionState();
-    public abstract boolean isConcurrentVoiceAndDataAllowed();
-    public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
-        logUnexpectedGsmMethodCall("registerForDataConnectionAttached");
-    }
-
-    public void unregisterForDataConnectionAttached(Handler h) {
-        logUnexpectedGsmMethodCall("unregisterForDataConnectionAttached");
-    }
-
-    public void registerForDataConnectionDetached(Handler h, int what, Object obj) {
-        logUnexpectedGsmMethodCall("registerForDataConnectionDetached");
-    }
-
-    public void unregisterForDataConnectionDetached(Handler h) {
-        logUnexpectedGsmMethodCall("unregisterForDataConnectionDetached");
-    }
-
-    public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
-        logUnexpectedGsmMethodCall("registerForPsRestrictedEnabled");
-    }
-
-    public void unregisterForPsRestrictedEnabled(Handler h) {
-        logUnexpectedGsmMethodCall("unregisterForPsRestrictedEnabled");
-    }
-
-    public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
-        logUnexpectedGsmMethodCall("registerForPsRestrictedDisabled");
-    }
-
-    public void unregisterForPsRestrictedDisabled(Handler h) {
-        logUnexpectedGsmMethodCall("registerForPsRestrictedDisabled");
-    }
-
     /**
      * Clean up existing voice and data connection then turn off radio power.
      *
      * Hang up the existing voice calls to decrease call drop rate.
      */
-    public abstract void powerOffRadioSafely();
+    protected abstract void powerOffRadioSafely();
 
     /** Cancel a pending (if any) pollState() operation */
     protected void cancelPollState() {
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
deleted file mode 100644
index 300670f..0000000
--- a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2006 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.internal.telephony.cdma;
-
-import android.os.SystemProperties;
-import android.content.Context;
-import android.net.Uri;
-import android.content.Context;
-import android.provider.Telephony;
-import android.content.ContentValues;
-import android.database.SQLException;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-
-import com.android.internal.telephony.gsm.SIMRecords;
-import com.android.internal.telephony.gsm.SimCard;
-import com.android.internal.telephony.ServiceStateTracker;
-import com.android.internal.telephony.DataConnectionTracker;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
-import com.android.internal.telephony.PhoneNotifier;
-import com.android.internal.telephony.PhoneProxy;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.gsm.GsmDataConnectionTracker;
-
-import android.util.Log;
-
-public class CDMALTEPhone extends CDMAPhone {
-    static final String LOG_TAG = "CDMA";
-
-    private static final boolean DBG = true;
-
-    // Constructors
-    public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
-        this(context, ci, notifier, false);
-        log("CDMALTEPhone Constructors");
-    }
-
-    public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
-            boolean unitTestMode) {
-        super(context, ci, notifier, false);
-        mSST = new CdmaLteServiceStateTracker(this);
-        init(context, notifier);
-
-        mSIMRecords = new SIMRecords(this);
-        mSimCard = new SimCard(this, LOG_TAG, DBG);
-    }
-
-    public void dispose() {
-        synchronized (PhoneProxy.lockForRadioTechnologyChange) {
-            super.dispose();
-            mSIMRecords.dispose();
-            mSimCard.dispose();
-        }
-    }
-
-    @Override
-    public void removeReferences() {
-        super.removeReferences();
-        this.mSIMRecords = null;
-        this.mSimCard = null;
-    }
-
-    @Override
-    public ServiceStateTracker getServiceStateTracker() {
-        return mSST;
-    }
-
-    public IccCard getIccCard() {
-        return mSimCard;
-    }
-
-    @Override
-    public String getIccSerialNumber() {
-        return mSIMRecords.iccid;
-    }
-
-    @Override
-    public DataState getDataConnectionState(String apnType) {
-        boolean isCdmaDataConnectionTracker = false;
-        if (mDataConnection instanceof CdmaDataConnectionTracker) {
-            isCdmaDataConnectionTracker = true;
-        }
-        log("getDataConnectionState");
-        DataState ret = DataState.DISCONNECTED;
-
-        if (!isCdmaDataConnectionTracker && (SystemProperties.get("adb.connected", "").length()
-                > 0)) {
-            // We're connected to an ADB host and we have USB networking
-            // turned on. No matter what the radio state is,
-            // we report data connected
-
-            ret = DataState.CONNECTED;
-        } else if (mSST == null) {
-            // Radio Technology Change is ongoning, dispose() and
-            // removeReferences() have
-            // already been called
-
-            ret = DataState.DISCONNECTED;
-        } else if (mSST.getCurrentCdmaDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
-            // If we're out of service, open TCP sockets may still work
-            // but no data will flow
-            ret = DataState.DISCONNECTED;
-        } else if (mDataConnection.isApnTypeEnabled(apnType) == false) {
-            ret = DataState.DISCONNECTED;
-        } else {
-            DataConnectionTracker.State state;
-            if (isCdmaDataConnectionTracker) {
-                state = mDataConnection.getState();
-            } else {
-                state = ((GsmDataConnectionTracker)mDataConnection).getState(apnType);
-            }
-            switch (state) {
-                case FAILED:
-                case IDLE:
-                    ret = DataState.DISCONNECTED;
-                    break;
-
-                case CONNECTED:
-                case DISCONNECTING:
-                    if (mCT.state != Phone.State.IDLE && !mSST.isConcurrentVoiceAndDataAllowed()) {
-                        ret = DataState.SUSPENDED;
-                    } else {
-                        ret = DataState.CONNECTED;
-                    }
-                    break;
-
-                case INITING:
-                case CONNECTING:
-                case SCANNING:
-                    ret = DataState.CONNECTING;
-                    break;
-            }
-        }
-
-        return ret;
-    }
-
-    public boolean updateCurrentCarrierInProvider() {
-        if (mSIMRecords != null) {
-            try {
-                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
-                ContentValues map = new ContentValues();
-                map.put(Telephony.Carriers.NUMERIC, mSIMRecords.getSIMOperatorNumeric());
-                mContext.getContentResolver().insert(uri, map);
-                return true;
-            } catch (SQLException e) {
-                Log.e(LOG_TAG, "[CDMALTEPhone] Can't store current operator", e);
-            }
-        }
-        return false;
-    }
-
-    public String getActiveApn(String apnType) {
-        if (mDataConnection instanceof CdmaDataConnectionTracker)
-            return mDataConnection.getActiveApnString();
-
-        return ((GsmDataConnectionTracker)mDataConnection).getActiveApnString(apnType);
-    }
-
-    protected void log(String s) {
-        if (DBG)
-            Log.d(LOG_TAG, "[CDMALTEPhone] " + s);
-    }
-}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index 2c7243e..74adebd 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -66,7 +66,6 @@
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.TelephonyProperties;
 import com.android.internal.telephony.UUSInfo;
-import com.android.internal.telephony.CallTracker;
 
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
@@ -98,6 +97,7 @@
 
     // Instance Variables
     CdmaCallTracker mCT;
+    CdmaSMSDispatcher mSMS;
     CdmaServiceStateTracker mSST;
     RuimRecords mRuimRecords;
     RuimCard mRuimCard;
@@ -141,21 +141,16 @@
 
     // Constructors
     public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
-        super(notifier, context, ci, false);
-        mSST = new CdmaServiceStateTracker (this);
-        init(context, notifier);
+        this(context,ci,notifier, false);
     }
 
     public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
             boolean unitTestMode) {
         super(notifier, context, ci, unitTestMode);
-        mSST = new CdmaServiceStateTracker (this);
-        init(context, notifier);
-    }
 
-    protected void init(Context context, PhoneNotifier notifier) {
         mCM.setPhoneType(Phone.PHONE_TYPE_CDMA);
         mCT = new CdmaCallTracker(this);
+        mSST = new CdmaServiceStateTracker (this);
         mSMS = new CdmaSMSDispatcher(this);
         mIccFileHandler = new RuimFileHandler(this);
         mRuimRecords = new RuimRecords(this);
@@ -275,18 +270,10 @@
         return mSST.ss;
     }
 
-    public CallTracker getCallTracker() {
-        return mCT;
-    }
-
     public Phone.State getState() {
         return mCT.state;
     }
 
-    public ServiceStateTracker getServiceStateTracker() {
-        return mSST;
-    }
-
     public String getPhoneName() {
         return "CDMA";
     }
@@ -638,7 +625,7 @@
                 case CONNECTED:
                 case DISCONNECTING:
                     if ( mCT.state != Phone.State.IDLE
-                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
+                            && !mSST.isConcurrentVoiceAndData()) {
                         ret = DataState.SUSPENDED;
                     } else {
                         ret = DataState.CONNECTED;
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index 79f4152..a89f783 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -134,10 +134,6 @@
     public void registerForVoiceCallStarted(Handler h, int what, Object obj) {
         Registrant r = new Registrant(h, what, obj);
         voiceCallStartedRegistrants.add(r);
-        // Notify if in call when registering
-        if (state != Phone.State.IDLE) {
-            r.notifyRegistrant(new AsyncResult(null, null, null));
-        }
     }
     public void unregisterForVoiceCallStarted(Handler h) {
         voiceCallStartedRegistrants.remove(h);
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java b/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java
index 1a15393..fbe455e 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java
@@ -430,7 +430,7 @@
                 } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
                         || serviceState == ServiceState.STATE_EMERGENCY_ONLY) {
                     return DisconnectCause.OUT_OF_SERVICE;
-                } else if (phone.mCM.getNvState() != CommandsInterface.RadioState.NV_READY
+                } else if (phone.mCM.getRadioState() != CommandsInterface.RadioState.NV_READY
                         && phone.getIccCard().getState() != RuimCard.State.READY) {
                     return DisconnectCause.ICC_ERROR;
                 } else if (causeCode==CallFailCause.NORMAL_CLEARING) {
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 8307a48..8c36106 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -167,6 +167,30 @@
         return false;
     }
 
+    /**
+     * The data connection is expected to be setup while device
+     *  1. has ruim card or non-volatile data store
+     *  2. registered to data connection service
+     *  3. user doesn't explicitly disable data service
+     *  4. wifi is not on
+     *
+     * @return false while no data connection if all above requirements are met.
+     */
+    @Override
+    public boolean isDataConnectionAsDesired() {
+        boolean roaming = mPhone.getServiceState().getRoaming();
+
+        if (((mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY) ||
+                 mCdmaPhone.mRuimRecords.getRecordsLoaded()) &&
+                (mCdmaPhone.mSST.getCurrentCdmaDataConnectionState() ==
+                 ServiceState.STATE_IN_SERVICE) &&
+                (!roaming || getDataOnRoamingEnabled()) &&
+                !mIsWifiConnected ) {
+            return (mState == State.CONNECTED);
+        }
+        return true;
+    }
+
     @Override
     protected boolean isDataAllowed() {
         int psState = mCdmaPhone.mSST.getCurrentCdmaDataConnectionState();
@@ -176,9 +200,9 @@
         boolean allowed =
                     (psState == ServiceState.STATE_IN_SERVICE ||
                             mAutoAttachOnCreation) &&
-                    (mPhone.mCM.getNvState() == CommandsInterface.RadioState.NV_READY ||
+                    (mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY ||
                             mCdmaPhone.mRuimRecords.getRecordsLoaded()) &&
-                    (mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
+                    (mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
                             mPhone.getState() == Phone.State.IDLE) &&
                     !roaming &&
                     mInternalDataEnabled &&
@@ -190,11 +214,11 @@
             if (!((psState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
                 reason += " - psState= " + psState;
             }
-            if (!(mPhone.mCM.getNvState() == CommandsInterface.RadioState.NV_READY ||
+            if (!(mPhone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY ||
                     mCdmaPhone.mRuimRecords.getRecordsLoaded())) {
-                reason += " - radioState= " + mPhone.mCM.getNvState() + " - RUIM not loaded";
+                reason += " - radioState= " + mPhone.mCM.getRadioState() + " - RUIM not loaded";
             }
-            if (!(mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
+            if (!(mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
                     mPhone.getState() == Phone.State.IDLE)) {
                 reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState();
             }
@@ -238,7 +262,9 @@
     }
 
     /**
-     * Cleanup the CDMA data connection (only one is supported)
+     * Cleanup all connections.
+     *
+     * TODO: Cleanup only a specified connection passed as a parameter.
      *
      * @param tearDown true if the underlying DataConnection should be disconnected.
      * @param reason for the clean up.
@@ -311,7 +337,7 @@
             apnId = mDefaultApnId;
         }
         mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "",
-                                    "", 0, types, "IP", "IP", true, 0, 0);
+                                    "", 0, types, "IP", "IP");
         if (DBG) log("setupData: mActiveApn=" + mActiveApn);
 
         Message msg = obtainMessage();
@@ -360,7 +386,7 @@
     protected void restartRadio() {
         if (DBG) log("Cleanup connection and wait " +
                 (TIME_DELAYED_TO_RESTART_RADIO / 1000) + "s to restart radio");
-        cleanUpAllConnections();
+        cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF);
         sendEmptyMessageDelayed(EVENT_RESTART_RADIO, TIME_DELAYED_TO_RESTART_RADIO);
         mPendingRestartRadio = true;
     }
@@ -517,14 +543,14 @@
 
     protected void onRecordsLoaded() {
         if (mState == State.FAILED) {
-            cleanUpAllConnections();
+            cleanUpConnection(false, null);
         }
         sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED));
     }
 
     protected void onNVReady() {
         if (mState == State.FAILED) {
-            cleanUpAllConnections();
+            cleanUpConnection(false, null);
         }
         sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
     }
@@ -534,7 +560,6 @@
      */
     @Override
     protected void onEnableNewApn() {
-        // No mRequestedApnType check; only one connection is supported
         cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
     }
 
@@ -563,7 +588,7 @@
             trySetupData(Phone.REASON_ROAMING_ON);
         } else {
             if (DBG) log("Tear down data connection on roaming.");
-            cleanUpAllConnections();
+            cleanUpConnection(true, Phone.REASON_ROAMING_ON);
         }
     }
 
@@ -584,7 +609,7 @@
         notifyDataAvailability(null);
 
         if (mState != State.IDLE) {
-            cleanUpAllConnections();
+            cleanUpConnection(true, null);
         }
     }
 
@@ -601,7 +626,7 @@
             log("We're on the simulator; assuming radio off is meaningless");
         } else {
             if (DBG) log("Radio is off and clean up all connection");
-            cleanUpAllConnections();
+            cleanUpConnection(false, Phone.REASON_RADIO_TURNED_OFF);
         }
     }
 
@@ -686,7 +711,7 @@
      */
     @Override
     protected void onVoiceCallStarted() {
-        if (mState == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) {
+        if (mState == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
             stopNetStatPoll();
             notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
             notifyDataAvailability(Phone.REASON_VOICE_CALL_STARTED);
@@ -699,7 +724,7 @@
     @Override
     protected void onVoiceCallEnded() {
         if (mState == State.CONNECTED) {
-            if (!mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) {
+            if (!mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
                 startNetStatPoll();
                 notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
             } else {
@@ -715,17 +740,10 @@
     }
 
     @Override
-    protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) {
-        // No apnId check; only one connection is supported
+    protected void onCleanUpConnection(boolean tearDown, String reason) {
         cleanUpConnection(tearDown, reason);
     }
 
-    @Override
-    protected void onCleanUpAllConnections() {
-        // Only one CDMA connection is supported
-        cleanUpConnection(true, null);
-    }
-
     private void createAllDataConnectionList() {
         CdmaDataConnection dataConn;
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
deleted file mode 100644
index 5883555..0000000
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.internal.telephony.cdma;
-
-import com.android.internal.telephony.DataConnectionTracker;
-import com.android.internal.telephony.TelephonyProperties;
-import com.android.internal.telephony.MccTable;
-import com.android.internal.telephony.EventLogTags;
-import com.android.internal.telephony.RILConstants;
-
-import android.telephony.SignalStrength;
-import android.telephony.ServiceState;
-import android.telephony.cdma.CdmaCellLocation;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Registrant;
-import android.os.RegistrantList;
-import android.os.AsyncResult;
-import android.os.Message;
-
-import android.util.Log;
-import android.util.EventLog;
-
-import com.android.internal.telephony.gsm.RestrictedState;
-import com.android.internal.telephony.gsm.GsmDataConnectionTracker;
-
-public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker {
-    static final String LOG_TAG = "CDMA";
-
-    CDMALTEPhone mCdmaLtePhone;
-
-    private RestrictedState rs;
-
-    private int gprsState = ServiceState.STATE_OUT_OF_SERVICE;
-
-    private int newGPRSState = ServiceState.STATE_OUT_OF_SERVICE;
-
-    private RegistrantList gprsAttachedRegistrants = new RegistrantList();
-
-    private RegistrantList gprsDetachedRegistrants = new RegistrantList();
-
-    private RegistrantList psRestrictEnabledRegistrants = new RegistrantList();
-
-    private RegistrantList psRestrictDisabledRegistrants = new RegistrantList();
-
-    public CdmaLteServiceStateTracker(CDMALTEPhone phone) {
-        super(phone);
-        mCdmaLtePhone = phone;
-        rs = new RestrictedState();
-        log("CdmaLteServiceStateTracker Constructors");
-    }
-
-    // Added 9 new functions needed in GsmDataConnectionTracker, functions were
-    // copied over from GsmServiceStateTracker.
-    /**
-     * Registration point for transition into GPRS attached.
-     *
-     * @param h handler to notify
-     * @param what what code of message when delivered
-     * @param obj placed in Message.obj
-     */
-    public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
-        log("registerForDataConnectionAttached ");
-        Registrant r = new Registrant(h, what, obj);
-        gprsAttachedRegistrants.add(r);
-
-        if (gprsState == ServiceState.STATE_IN_SERVICE) {
-            r.notifyRegistrant();
-        }
-    }
-
-    public void unregisterForDataConnectionAttached(Handler h) {
-        gprsAttachedRegistrants.remove(h);
-    }
-
-    /**
-     * Registration point for transition into GPRS detached.
-     *
-     * @param h handler to notify
-     * @param what what code of message when delivered
-     * @param obj placed in Message.obj
-     */
-    public void registerForDataConnectionDetached(Handler h, int what, Object obj) {
-        log("registerForDataConnectionDetached ");
-        Registrant r = new Registrant(h, what, obj);
-        gprsDetachedRegistrants.add(r);
-        if (gprsState == ServiceState.STATE_OUT_OF_SERVICE) {
-            r.notifyRegistrant();
-        }
-    }
-
-    public void unregisterForDataConnectionDetached(Handler h) {
-        gprsDetachedRegistrants.remove(h);
-    }
-
-    /**
-     * Registration point for transition into packet service restricted zone.
-     *
-     * @param h handler to notify
-     * @param what what code of message when delivered
-     * @param obj placed in Message.obj
-     */
-    public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
-        log("registerForPsRestrictedEnabled ");
-        Registrant r = new Registrant(h, what, obj);
-        psRestrictEnabledRegistrants.add(r);
-
-        if (rs.isPsRestricted()) {
-            r.notifyRegistrant();
-        }
-    }
-
-    public void unregisterForPsRestrictedEnabled(Handler h) {
-        psRestrictEnabledRegistrants.remove(h);
-    }
-
-    /**
-     * Registration point for transition out of packet service restricted zone.
-     *
-     * @param h handler to notify
-     * @param what what code of message when delivered
-     * @param obj placed in Message.obj
-     */
-    public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
-        log("registerForPsRestrictedDisabled ");
-        Registrant r = new Registrant(h, what, obj);
-        psRestrictDisabledRegistrants.add(r);
-
-        if (rs.isPsRestricted()) {
-            r.notifyRegistrant();
-        }
-    }
-
-    public void unregisterForPsRestrictedDisabled(Handler h) {
-        psRestrictDisabledRegistrants.remove(h);
-    }
-
-    /**
-     * @return The current GPRS state. IN_SERVICE is the same as "attached" and
-     *         OUT_OF_SERVICE is the same as detached.
-     */
-    public int getCurrentDataConnectionState() {
-        return gprsState;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        AsyncResult ar;
-        int[] ints;
-        String[] strings;
-        if (msg.what == EVENT_POLL_STATE_GPRS) {
-            log("handleMessage EVENT_POLL_STATE_GPRS");
-            ar = (AsyncResult)msg.obj;
-            handlePollStateResult(msg.what, ar);
-        } else {
-            super.handleMessage(msg);
-        }
-    }
-
-    /**
-     * The LTE data connection state, only return true here
-     */
-    @Override
-    protected boolean checkAdditionalDataAvaiable() {
-        return newGPRSState != ServiceState.STATE_IN_SERVICE;
-    }
-
-    /**
-     * Handle the result of one of the pollState()-related requests
-     */
-    @Override
-    protected void handlePollStateResultMessage(int what, AsyncResult ar) {
-        if (what == EVENT_POLL_STATE_GPRS) {
-            log("handlePollStateResultMessage EVENT_POLL_STATE_GPRS");
-            String states[] = (String[])ar.result;
-
-            int type = 0;
-            int regState = -1;
-            if (states.length > 0) {
-                try {
-                    regState = Integer.parseInt(states[0]);
-
-                    // states[3] (if present) is the current radio technology
-                    if (states.length >= 4 && states[3] != null) {
-                        type = Integer.parseInt(states[3]);
-                    }
-                } catch (NumberFormatException ex) {
-                    Log.w(LOG_TAG,
-                            "[CdmaLteServiceStateTracker] error parsing GprsRegistrationState: "
-                                    + ex);
-                }
-            }
-
-            newGPRSState = regCodeToServiceState(regState);
-            // Not sure if this is needed in CDMALTE phone.
-            // mDataRoaming = regCodeIsRoaming(regState);
-            if (newGPRSState == ServiceState.STATE_IN_SERVICE) {
-                this.newCdmaDataConnectionState = newGPRSState;
-                newNetworkType = type;
-                newSS.setRadioTechnology(type);
-            }
-        } else {
-            super.handlePollStateResultMessage(what, ar);
-        }
-    }
-
-    @Override
-    protected void setSignalStrengthDefaultValues() {
-        mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false);
-    }
-
-    @Override
-    protected void pollState() {
-        pollingContext = new int[1];
-        pollingContext[0] = 0;
-
-        switch (cm.getRadioState()) {
-            case RADIO_UNAVAILABLE:
-                newSS.setStateOutOfService();
-                newCellLoc.setStateInvalid();
-                setSignalStrengthDefaultValues();
-                mGotCountryCode = false;
-
-                pollStateDone();
-                break;
-
-            case RADIO_OFF:
-                newSS.setStateOff();
-                newCellLoc.setStateInvalid();
-                setSignalStrengthDefaultValues();
-                mGotCountryCode = false;
-
-                pollStateDone();
-                break;
-
-            case SIM_NOT_READY:
-            case SIM_LOCKED_OR_ABSENT:
-            case SIM_READY:
-                log("Radio Technology Change ongoing, setting SS to off");
-                newSS.setStateOff();
-                newCellLoc.setStateInvalid();
-                setSignalStrengthDefaultValues();
-                mGotCountryCode = false;
-                // NOTE: pollStateDone() is not needed in this case
-                break;
-
-            default:
-                // Issue all poll-related commands at once, then count
-                // down the responses which are allowed to arrive
-                // out-of-order.
-
-                pollingContext[0]++;
-                // RIL_REQUEST_OPERATOR is necessary for CDMA
-                cm.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, pollingContext));
-
-                pollingContext[0]++;
-                // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA
-                cm.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA,
-                        pollingContext));
-
-                int networkMode = android.provider.Settings.Secure.getInt(phone.getContext()
-                        .getContentResolver(),
-                        android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
-                        RILConstants.PREFERRED_NETWORK_MODE);
-                Log.v(LOG_TAG, "[CdmaLteServiceStateTracker] The network mode here is = "
-                        + networkMode);
-                if ((networkMode == RILConstants.NETWORK_MODE_GLOBAL)
-                        || (networkMode == RILConstants.NETWORK_MODE_LTE_ONLY)) {
-                    pollingContext[0]++;
-                    // RIL_REQUEST_DATA_REGISTRATION_STATE
-                    cm.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS,
-                                                pollingContext));
-                }
-                break;
-        }
-    }
-
-    protected static String networkTypeToString(int type) {
-        String ret = "unknown";
-
-        switch (type) {
-            case DATA_ACCESS_CDMA_IS95A:
-            case DATA_ACCESS_CDMA_IS95B:
-                ret = "CDMA";
-                break;
-            case DATA_ACCESS_CDMA_1xRTT:
-                ret = "CDMA - 1xRTT";
-                break;
-            case DATA_ACCESS_CDMA_EvDo_0:
-                ret = "CDMA - EvDo rev. 0";
-                break;
-            case DATA_ACCESS_CDMA_EvDo_A:
-                ret = "CDMA - EvDo rev. A";
-                break;
-            case DATA_ACCESS_CDMA_EvDo_B:
-                ret = "CDMA - EvDo rev. B";
-                break;
-            case DATA_ACCESS_LTE:
-                ret = "LTE";
-                break;
-            case DATA_ACCESS_EHRPD:
-                ret = "CDMA - eHRPD";
-            default:
-                if (DBG) {
-                    Log.e(LOG_TAG, " [CdmaLteServiceStateTracker] Wrong network."
-                           + " Can not return a string.");
-                }
-                break;
-        }
-        return ret;
-    }
-
-    @Override
-    protected void pollStateDone() {
-        log("Poll ServiceState done: oldSS=[" + ss + "] newSS=[" + newSS + "]");
-
-        boolean hasRegistered = ss.getState() != ServiceState.STATE_IN_SERVICE
-                && newSS.getState() == ServiceState.STATE_IN_SERVICE;
-
-        boolean hasDeregistered = ss.getState() == ServiceState.STATE_IN_SERVICE
-                && newSS.getState() != ServiceState.STATE_IN_SERVICE;
-
-        boolean hasCdmaDataConnectionAttached =
-            this.cdmaDataConnectionState != ServiceState.STATE_IN_SERVICE
-                && this.newCdmaDataConnectionState == ServiceState.STATE_IN_SERVICE;
-
-        boolean hasCdmaDataConnectionDetached =
-            this.cdmaDataConnectionState == ServiceState.STATE_IN_SERVICE
-                && this.newCdmaDataConnectionState != ServiceState.STATE_IN_SERVICE;
-
-        boolean hasCdmaDataConnectionChanged =
-            cdmaDataConnectionState != newCdmaDataConnectionState;
-
-        boolean hasNetworkTypeChanged = networkType != newNetworkType;
-
-        boolean hasChanged = !newSS.equals(ss);
-
-        boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming();
-
-        boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming();
-
-        boolean hasLocationChanged = !newCellLoc.equals(cellLoc);
-
-        boolean has4gHandoff =
-            ((networkType == DATA_ACCESS_LTE) && (newNetworkType == DATA_ACCESS_EHRPD))
-                || ((networkType == DATA_ACCESS_EHRPD) && (newNetworkType == DATA_ACCESS_LTE));
-
-        boolean hasMultiApnSupport =
-            (((newNetworkType == DATA_ACCESS_LTE) || (newNetworkType == DATA_ACCESS_EHRPD)) 
-                    && ((networkType != DATA_ACCESS_LTE) && (networkType != DATA_ACCESS_EHRPD)));
-
-        boolean hasLostMultiApnSupport =
-            ((newNetworkType >= DATA_ACCESS_CDMA_IS95A)
-                    && (newNetworkType <= DATA_ACCESS_CDMA_EvDo_A));
-
-        log("hasRegistered = " + hasRegistered + " hasCdmaDataConnectionAttached = "
-                + hasCdmaDataConnectionAttached + " hasCdmaDataConnectionChanged = "
-                + hasCdmaDataConnectionChanged + " hasNetworkTypeChanged = "
-                + hasNetworkTypeChanged + " has4gHandoff = " + has4gHandoff
-                + " hasMultiApnSupport = " + hasMultiApnSupport + " hasLostMultiApnSupport = "
-                + hasLostMultiApnSupport);
-        // Add an event log when connection state changes
-        if (ss.getState() != newSS.getState()
-                || cdmaDataConnectionState != newCdmaDataConnectionState) {
-            EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, ss.getState(),
-                    cdmaDataConnectionState, newSS.getState(), newCdmaDataConnectionState);
-        }
-
-        ServiceState tss;
-        tss = ss;
-        ss = newSS;
-        newSS = tss;
-        // clean slate for next time
-        newSS.setStateOutOfService();
-
-        // TODO: 4G Tech Handoff
-        // if (has4gHandoff) {
-        // Message msg = phone.mDataConnection.obtainMessage(
-        // DataConnectionTracker.EVENT_4G_TECHNOLOGY_CHANGE);
-        // phone.mDataConnection.sendMessage(msg);
-        // }
-
-        if ((hasMultiApnSupport)
-                && (phone.mDataConnection instanceof CdmaDataConnectionTracker)) {
-            log("GsmDataConnectionTracker Created");
-            phone.mDataConnection.dispose();
-            phone.mDataConnection = new GsmDataConnectionTracker(mCdmaLtePhone);
-        }
-
-        if ((hasLostMultiApnSupport)
-                && (phone.mDataConnection instanceof GsmDataConnectionTracker)) {
-            log("GsmDataConnectionTracker disposed");
-            phone.mDataConnection.dispose();
-            phone.mDataConnection = new CdmaDataConnectionTracker((CDMAPhone)phone);
-        }
-
-        CdmaCellLocation tcl = cellLoc;
-        cellLoc = newCellLoc;
-        newCellLoc = tcl;
-
-        cdmaDataConnectionState = newCdmaDataConnectionState;
-        networkType = newNetworkType;
-
-        gprsState = newCdmaDataConnectionState;
-
-        newSS.setStateOutOfService(); // clean slate for next time
-
-        if (hasNetworkTypeChanged) {
-            phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
-                    networkTypeToString(networkType));
-        }
-
-        if (hasRegistered) {
-            networkAttachedRegistrants.notifyRegistrants();
-        }
-
-        if (hasChanged) {
-            if (cm.getNvState().isNVReady()) {
-                String eriText;
-                // Now the CDMAPhone sees the new ServiceState so it can get the
-                // new ERI text
-                if (ss.getState() == ServiceState.STATE_IN_SERVICE) {
-                    eriText = phone.getCdmaEriText();
-                } else {
-                    // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used
-                    // for
-                    // mRegistrationState 0,2,3 and 4
-                    eriText = phone.getContext()
-                            .getText(com.android.internal.R.string.roamingTextSearching).toString();
-                }
-                ss.setCdmaEriText(eriText);
-            }
-
-            String operatorNumeric;
-
-            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
-                    ss.getOperatorAlphaLong());
-
-            operatorNumeric = ss.getOperatorNumeric();
-            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
-
-            if (operatorNumeric == null) {
-                phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
-            } else {
-                String isoCountryCode = "";
-                try {
-                    isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(operatorNumeric
-                            .substring(0, 3)));
-                } catch (NumberFormatException ex) {
-                    Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
-                } catch (StringIndexOutOfBoundsException ex) {
-                    Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
-                }
-
-                phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
-                        isoCountryCode);
-                mGotCountryCode = true;
-                if (mNeedFixZone) {
-                    fixTimeZone(isoCountryCode);
-                }
-            }
-
-            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
-                    ss.getRoaming() ? "true" : "false");
-
-            updateSpnDisplay();
-            phone.notifyServiceStateChanged(ss);
-        }
-
-        if (hasCdmaDataConnectionAttached) {
-            cdmaDataConnectionAttachedRegistrants.notifyRegistrants();
-            gprsAttachedRegistrants.notifyRegistrants();
-        }
-
-        if (hasCdmaDataConnectionDetached) {
-            cdmaDataConnectionDetachedRegistrants.notifyRegistrants();
-            gprsDetachedRegistrants.notifyRegistrants();
-        }
-
-        if ((hasCdmaDataConnectionChanged || hasNetworkTypeChanged)
-                && (phone.mDataConnection instanceof CdmaDataConnectionTracker)) {
-            phone.notifyDataConnection();
-        }
-
-        if (hasRoamingOn) {
-            roamingOnRegistrants.notifyRegistrants();
-        }
-
-        if (hasRoamingOff) {
-            roamingOffRegistrants.notifyRegistrants();
-        }
-
-        if (hasLocationChanged) {
-            phone.notifyLocationChanged();
-        }
-    }
-
-    protected void onSignalStrengthResult(AsyncResult ar) {
-        SignalStrength oldSignalStrength = mSignalStrength;
-
-        if (ar.exception != null) {
-            // Most likely radio is resetting/disconnected change to default
-            // values.
-            setSignalStrengthDefaultValues();
-        } else {
-            int[] ints = (int[])ar.result;
-            int lteCqi = 99, lteRsrp = -1;
-            int lteRssi = 99;
-            int offset = 2;
-            int cdmaDbm = (ints[offset] > 0) ? -ints[offset] : -120;
-            int cdmaEcio = (ints[offset + 1] > 0) ? -ints[offset + 1] : -160;
-            int evdoRssi = (ints[offset + 2] > 0) ? -ints[offset + 2] : -120;
-            int evdoEcio = (ints[offset + 3] > 0) ? -ints[offset + 3] : -1;
-            int evdoSnr = ((ints[offset + 4] > 0) && (ints[offset + 4] <= 8)) ? ints[offset + 4]
-                    : -1;
-            if (networkType == ServiceState.RADIO_TECHNOLOGY_LTE) {
-                lteRssi = (ints[offset + 5] >= 0) ? ints[offset + 5] : 99;
-                lteRsrp = (ints[offset + 6] > 0) ? -ints[offset + 7] : -1;
-                lteCqi = (ints[offset + 7] >= 0) ? ints[offset + 6] : 99;
-            }
-
-            if (networkType != ServiceState.RADIO_TECHNOLOGY_LTE) {
-                mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, evdoRssi, evdoEcio,
-                        evdoSnr, false);
-            } else {
-                mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, evdoRssi, evdoEcio,
-                        evdoSnr, lteRssi, lteRsrp, -1, -1, lteCqi, true);
-            }
-        }
-
-        try {
-            phone.notifySignalStrength();
-        } catch (NullPointerException ex) {
-            log("onSignalStrengthResult() Phone already destroyed: " + ex
-                    + "SignalStrength not notified");
-        }
-    }
-
-    public boolean isConcurrentVoiceAndDataAllowed() {
-        // Note: it needs to be confirmed which CDMA network types
-        // can support voice and data calls concurrently.
-        // For the time-being, the return value will be false.
-        // return (networkType >= DATA_ACCESS_LTE);
-        return false;
-    }
-
-    @Override
-    protected void log(String s) {
-        if (DBG)
-            Log.d(LOG_TAG, "[CdmaLteServiceStateTracker] " + s);
-    }
-}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index c0bfd23..6bd2d09 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -94,7 +94,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public int dispatchMessage(SmsMessageBase smsb) {
+    protected int dispatchMessage(SmsMessageBase smsb) {
 
         // If sms is null, means there was a parsing error.
         if (smsb == null) {
@@ -485,19 +485,19 @@
 
     /** {@inheritDoc} */
     @Override
-    public void activateCellBroadcastSms(int activate, Message response) {
+    protected void activateCellBroadcastSms(int activate, Message response) {
         mCm.setCdmaBroadcastActivation((activate == 0), response);
     }
 
     /** {@inheritDoc} */
     @Override
-    public void getCellBroadcastSmsConfig(Message response) {
+    protected void getCellBroadcastSmsConfig(Message response) {
         mCm.getCdmaBroadcastConfig(response);
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setCellBroadcastConfig(int[] configValuesArray, Message response) {
+    protected void setCellBroadcastConfig(int[] configValuesArray, Message response) {
         mCm.setCdmaBroadcastConfig(configValuesArray, response);
     }
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index 31250ad..0debb42 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -61,7 +61,7 @@
 /**
  * {@hide}
  */
-public class CdmaServiceStateTracker extends ServiceStateTracker {
+final class CdmaServiceStateTracker extends ServiceStateTracker {
     static final String LOG_TAG = "CDMA";
 
     CDMAPhone phone;
@@ -88,8 +88,8 @@
     /**
      *  Values correspond to ServiceStateTracker.DATA_ACCESS_ definitions.
      */
-    protected int networkType = 0;
-    protected int newNetworkType = 0;
+    private int networkType = 0;
+    private int newNetworkType = 0;
 
     private boolean mCdmaRoaming = false;
     private int mRoamingIndicator;
@@ -99,23 +99,23 @@
     /**
      * Initially assume no data connection.
      */
-    protected int cdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
-    protected int newCdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
-    protected int mRegistrationState = -1;
-    protected RegistrantList cdmaDataConnectionAttachedRegistrants = new RegistrantList();
-    protected RegistrantList cdmaDataConnectionDetachedRegistrants = new RegistrantList();
-    protected RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
+    private int cdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
+    private int newCdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
+    private int mRegistrationState = -1;
+    private RegistrantList cdmaDataConnectionAttachedRegistrants = new RegistrantList();
+    private RegistrantList cdmaDataConnectionDetachedRegistrants = new RegistrantList();
+    private RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
 
     /**
      * Sometimes we get the NITZ time before we know what country we
      * are in. Keep the time zone information from the NITZ string so
      * we can fix the time zone once know the country.
      */
-    protected boolean mNeedFixZone = false;
+    private boolean mNeedFixZone = false;
     private int mZoneOffset;
     private boolean mZoneDst;
     private long mZoneTime;
-    protected boolean mGotCountryCode = false;
+    private boolean mGotCountryCode = false;
     String mSavedTimeZone;
     long mSavedTime;
     long mSavedAtTime;
@@ -566,21 +566,37 @@
             cm.setRadioPower(true, null);
         } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
             DataConnectionTracker dcTracker = phone.mDataConnection;
+            if (! dcTracker.isDataConnectionAsDesired()) {
+                EventLog.writeEvent(EventLogTags.DATA_NETWORK_STATUS_ON_RADIO_OFF,
+                        dcTracker.getStateInString(),
+                        dcTracker.getAnyDataEnabled() ? 1 : 0);
+            }
 
             // If it's on and available and we want it off gracefully
             powerOffRadioSafely();
         } // Otherwise, we're in the desired state
     }
 
-    // TODO: Consider moving this method to DataConnectionTracker
     @Override
-    public void powerOffRadioSafely() {
+    protected void powerOffRadioSafely() {
         DataConnectionTracker dcTracker = phone.mDataConnection;
 
+        Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
+        msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
+
         synchronized (this) {
             if (!mPendingRadioPowerOffAfterDataOff) {
-                if (dcTracker.isAnyActiveDataConnections()) {
-                    dcTracker.cleanUpAllConnections();
+                DataConnectionTracker.State currentState = dcTracker.getState();
+                if (currentState != DataConnectionTracker.State.CONNECTED
+                    && currentState != DataConnectionTracker.State.DISCONNECTING
+                    && currentState != DataConnectionTracker.State.INITING) {
+                    msg.arg1 = 0; // tearDown is false as it is not needed.
+                    dcTracker.sendMessage(msg);
+                    if (DBG) log("Data disconnected, turn off radio right away.");
+                    hangupAndPowerOff();
+                } else {
+                    msg.arg1 = 1; // tearDown is true
+                    dcTracker.sendMessage(msg);
                     if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 30000)) {
                         if (DBG) log("Wait upto 30s for data to disconnect, then turn off radio.");
                         mPendingRadioPowerOffAfterDataOff = true;
@@ -588,10 +604,6 @@
                         Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away.");
                         hangupAndPowerOff();
                     }
-                } else {
-                    dcTracker.cleanUpAllConnections();
-                    if (DBG) log("Data disconnected, turn off radio right away.");
-                    hangupAndPowerOff();
                 }
             }
         }
@@ -635,167 +647,14 @@
     }
 
     /**
-    * The LTE data connection state, only return true here
-    */
-    protected boolean checkAdditionalDataAvaiable(){
-        return true;
-    }
-
-    /**
-    * Hanlde the PollStateResult message
-    */
-    protected void handlePollStateResultMessage(int what, AsyncResult ar){
-        int ints[];
-        String states[];
-        switch (what) {
-        case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
-            states = (String[])ar.result;
-
-            int registrationState = 4;     //[0] registrationState
-            int radioTechnology = -1;      //[3] radioTechnology
-            int baseStationId = -1;        //[4] baseStationId
-            //[5] baseStationLatitude
-            int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
-            //[6] baseStationLongitude
-            int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
-            int cssIndicator = 0;          //[7] init with 0, because it is treated as a boolean
-            int systemId = 0;              //[8] systemId
-            int networkId = 0;             //[9] networkId
-            int roamingIndicator = -1;     //[10] Roaming indicator
-            int systemIsInPrl = 0;         //[11] Indicates if current system is in PRL
-            int defaultRoamingIndicator = 0;  //[12] Is default roaming indicator from PRL
-            int reasonForDenial = 0;       //[13] Denial reason if registrationState = 3
-
-            if (states.length == 14) {
-                try {
-                    if (states[0] != null) {
-                        registrationState = Integer.parseInt(states[0]);
-                    }
-                    if (states[3] != null) {
-                        radioTechnology = Integer.parseInt(states[3]);
-                    }
-                    if (states[4] != null) {
-                        baseStationId = Integer.parseInt(states[4]);
-                    }
-                    if (states[5] != null) {
-                        baseStationLatitude = Integer.parseInt(states[5]);
-                    }
-                    if (states[6] != null) {
-                        baseStationLongitude = Integer.parseInt(states[6]);
-                    }
-                    // Some carriers only return lat-lngs of 0,0
-                    if (baseStationLatitude == 0 && baseStationLongitude == 0) {
-                        baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
-                        baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
-                    }
-                    if (states[7] != null) {
-                        cssIndicator = Integer.parseInt(states[7]);
-                    }
-                    if (states[8] != null) {
-                        systemId = Integer.parseInt(states[8]);
-                    }
-                    if (states[9] != null) {
-                        networkId = Integer.parseInt(states[9]);
-                    }
-                    if (states[10] != null) {
-                        roamingIndicator = Integer.parseInt(states[10]);
-                    }
-                    if (states[11] != null) {
-                        systemIsInPrl = Integer.parseInt(states[11]);
-                    }
-                    if (states[12] != null) {
-                        defaultRoamingIndicator = Integer.parseInt(states[12]);
-                    }
-                    if (states[13] != null) {
-                        reasonForDenial = Integer.parseInt(states[13]);
-                    }
-                } catch (NumberFormatException ex) {
-                    Log.w(LOG_TAG, "error parsing RegistrationState: " + ex);
-                }
-            } else {
-                throw new RuntimeException("Warning! Wrong number of parameters returned from "
-                                     + "RIL_REQUEST_REGISTRATION_STATE: expected 14 got "
-                                     + states.length);
-            }
-
-            mRegistrationState = registrationState;
-            // When registration state is roaming and TSB58
-            // roaming indicator is not in the carrier-specified
-            // list of ERIs for home system, mCdmaRoaming is true.
-            mCdmaRoaming =
-                    regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
-            newSS.setState (regCodeToServiceState(registrationState));
-
-            if(checkAdditionalDataAvaiable()) {
-                this.newCdmaDataConnectionState =
-                        radioTechnologyToDataServiceState(radioTechnology);
-                newSS.setRadioTechnology(radioTechnology);
-                newNetworkType = radioTechnology;
-            }
-
-            newSS.setCssIndicator(cssIndicator);
-            newSS.setSystemAndNetworkId(systemId, networkId);
-            mRoamingIndicator = roamingIndicator;
-            mIsInPrl = (systemIsInPrl == 0) ? false : true;
-            mDefaultRoamingIndicator = defaultRoamingIndicator;
-
-
-            // Values are -1 if not available.
-            newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
-                    baseStationLongitude, systemId, networkId);
-
-            if (reasonForDenial == 0) {
-                mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
-            } else if (reasonForDenial == 1) {
-                mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
-            } else {
-                mRegistrationDeniedReason = "";
-            }
-
-            if (mRegistrationState == 3) {
-                if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
-            }
-            break;
-
-        case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
-            String opNames[] = (String[])ar.result;
-
-            if (opNames != null && opNames.length >= 3) {
-                // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
-                if ((opNames[2] == null) || (opNames[2].length() < 5)
-                        || ("00000".equals(opNames[2]))) {
-                    opNames[2] = SystemProperties.get(
-                            CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
-                    if (DBG) {
-                        log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
-                                " is bad. Using SystemProperties '" +
-                                        CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
-                                "'= " + opNames[2]);
-                    }
-                }
-                if (cm.getNvState().isNVReady()) {
-                    // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
-                    // ERI text, so here it is ignored what is coming from the modem.
-                    newSS.setOperatorName(null, opNames[1], opNames[2]);
-                } else {
-                    newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
-                }
-            } else {
-                Log.w(LOG_TAG, "error parsing opNames");
-            }
-            break;
-        default:
-            Log.e(LOG_TAG, "RIL response handle in wrong phone!"
-                + " Expected CDMA RIL request and get GSM RIL request.");
-        break;
-        }
-    }
-
-    /**
-     * Handle the result of one of the pollState() - related requests
+     * Handle the result of one of the pollState()-related requests
      */
+
     @Override
     protected void handlePollStateResult (int what, AsyncResult ar) {
+        int ints[];
+        String states[];
+
         // Ignore stale requests from last poll.
         if (ar.userObj != pollingContext) return;
 
@@ -825,7 +684,148 @@
                         ar.exception);
             }
         } else try {
-            handlePollStateResultMessage(what, ar);
+            switch (what) {
+            case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
+                states = (String[])ar.result;
+
+                int registrationState = 4;     //[0] registrationState
+                int radioTechnology = -1;      //[3] radioTechnology
+                int baseStationId = -1;        //[4] baseStationId
+                //[5] baseStationLatitude
+                int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
+                //[6] baseStationLongitude
+                int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
+                int cssIndicator = 0;          //[7] init with 0, because it is treated as a boolean
+                int systemId = 0;              //[8] systemId
+                int networkId = 0;             //[9] networkId
+                int roamingIndicator = -1;     //[10] Roaming indicator
+                int systemIsInPrl = 0;         //[11] Indicates if current system is in PRL
+                int defaultRoamingIndicator = 0;  //[12] Is default roaming indicator from PRL
+                int reasonForDenial = 0;       //[13] Denial reason if registrationState = 3
+
+                if (states.length == 14) {
+                    try {
+                        if (states[0] != null) {
+                            registrationState = Integer.parseInt(states[0]);
+                        }
+                        if (states[3] != null) {
+                            radioTechnology = Integer.parseInt(states[3]);
+                        }
+                        if (states[4] != null) {
+                            baseStationId = Integer.parseInt(states[4]);
+                        }
+                        if (states[5] != null) {
+                            baseStationLatitude = Integer.parseInt(states[5]);
+                        }
+                        if (states[6] != null) {
+                            baseStationLongitude = Integer.parseInt(states[6]);
+                        }
+                        // Some carriers only return lat-lngs of 0,0
+                        if (baseStationLatitude == 0 && baseStationLongitude == 0) {
+                            baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
+                            baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
+                        }
+                        if (states[7] != null) {
+                            cssIndicator = Integer.parseInt(states[7]);
+                        }
+                        if (states[8] != null) {
+                            systemId = Integer.parseInt(states[8]);
+                        }
+                        if (states[9] != null) {
+                            networkId = Integer.parseInt(states[9]);
+                        }
+                        if (states[10] != null) {
+                            roamingIndicator = Integer.parseInt(states[10]);
+                        }
+                        if (states[11] != null) {
+                            systemIsInPrl = Integer.parseInt(states[11]);
+                        }
+                        if (states[12] != null) {
+                            defaultRoamingIndicator = Integer.parseInt(states[12]);
+                        }
+                        if (states[13] != null) {
+                            reasonForDenial = Integer.parseInt(states[13]);
+                        }
+                    } catch (NumberFormatException ex) {
+                        Log.w(LOG_TAG, "error parsing RegistrationState: " + ex);
+                    }
+                } else {
+                    throw new RuntimeException("Warning! Wrong number of parameters returned from "
+                                         + "RIL_REQUEST_REGISTRATION_STATE: expected 14 got "
+                                         + states.length);
+                }
+
+                mRegistrationState = registrationState;
+                // When registration state is roaming and TSB58
+                // roaming indicator is not in the carrier-specified
+                // list of ERIs for home system, mCdmaRoaming is true.
+                mCdmaRoaming =
+                        regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
+                newSS.setState (regCodeToServiceState(registrationState));
+
+                this.newCdmaDataConnectionState =
+                        radioTechnologyToDataServiceState(radioTechnology);
+                newSS.setRadioTechnology(radioTechnology);
+                newNetworkType = radioTechnology;
+
+                newSS.setCssIndicator(cssIndicator);
+                newSS.setSystemAndNetworkId(systemId, networkId);
+                mRoamingIndicator = roamingIndicator;
+                mIsInPrl = (systemIsInPrl == 0) ? false : true;
+                mDefaultRoamingIndicator = defaultRoamingIndicator;
+
+
+                // Values are -1 if not available.
+                newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
+                        baseStationLongitude, systemId, networkId);
+
+                if (reasonForDenial == 0) {
+                    mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
+                } else if (reasonForDenial == 1) {
+                    mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
+                } else {
+                    mRegistrationDeniedReason = "";
+                }
+
+                if (mRegistrationState == 3) {
+                    if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
+                }
+                break;
+
+            case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
+                String opNames[] = (String[])ar.result;
+
+                if (opNames != null && opNames.length >= 3) {
+                    // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
+                    if ((opNames[2] == null) || (opNames[2].length() < 5)
+                            || ("00000".equals(opNames[2]))) {
+                        opNames[2] = SystemProperties.get(
+                                CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
+                        if (DBG) {
+                            log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
+                                    " is bad. Using SystemProperties '" +
+                                            CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
+                                    "'= " + opNames[2]);
+                        }
+                    }
+                    if (cm.getRadioState().isNVReady()) {
+                        // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
+                        // ERI text, so here it is ignored what is coming from the modem.
+                        newSS.setOperatorName(null, opNames[1], opNames[2]);
+                    } else {
+                        newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
+                    }
+                } else {
+                    Log.w(LOG_TAG, "error parsing opNames");
+                }
+                break;
+
+            default:
+                Log.e(LOG_TAG, "RIL response handle in wrong phone!"
+                    + " Expected CDMA RIL request and get GSM RIL request.");
+            break;
+            }
+
         } catch (RuntimeException ex) {
             Log.e(LOG_TAG, "Exception while polling service state. "
                     + "Probably malformed RIL response.", ex);
@@ -896,8 +896,9 @@
 
     }
 
-    protected void setSignalStrengthDefaultValues() {
-        mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, false);
+    private void setSignalStrengthDefaultValues() {
+        mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1,
+                -1, -1, -1, -1, -1, false);
     }
 
     /**
@@ -908,7 +909,7 @@
      * and start over again if the radio notifies us that some
      * event has changed
      */
-    protected void
+    private void
     pollState() {
         pollingContext = new int[1];
         pollingContext[0] = 0;
@@ -963,7 +964,7 @@
         }
     }
 
-    protected static String networkTypeToString(int type) {
+    private static String networkTypeToString(int type) {
         String ret = "unknown";
 
         switch (type) {
@@ -993,7 +994,7 @@
         return ret;
     }
 
-    protected void fixTimeZone(String isoCountryCode) {
+    private void fixTimeZone(String isoCountryCode) {
         TimeZone zone = null;
         // If the offset is (0, false) and the time zone property
         // is set, use the time zone property rather than GMT.
@@ -1030,7 +1031,7 @@
         }
     }
 
-    protected void pollStateDone() {
+    private void pollStateDone() {
         if (DBG) log("Poll ServiceState done: oldSS=[" + ss + "] newSS=[" + newSS + "]");
 
         boolean hasRegistered =
@@ -1233,7 +1234,7 @@
      *  send signal-strength-changed notification if changed
      *  Called both for solicited and unsolicited signal strength updates
      */
-    protected void
+    private void
     onSignalStrengthResult(AsyncResult ar) {
         SignalStrength oldSignalStrength = mSignalStrength;
 
@@ -1252,7 +1253,7 @@
             //log(String.format("onSignalStrengthResult cdmaDbm=%d cdmaEcio=%d evdoRssi=%d evdoEcio=%d evdoSnr=%d",
             //        cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, evdoSnr));
             mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio,
-                    evdoRssi, evdoEcio, evdoSnr, false);
+                    evdoRssi, evdoEcio, evdoSnr, -1, -1, -1, -1, -1, false);
         }
 
         try {
@@ -1288,7 +1289,7 @@
     }
 
     /** code is registration state 0-5 from TS 27.007 7.2 */
-    protected int
+    private int
     regCodeToServiceState(int code) {
         switch (code) {
         case 0: // Not searching and not registered
@@ -1318,13 +1319,6 @@
     }
 
     /**
-    * TODO: In the future, we need remove getCurrentCdmaDataConnectionState
-    */
-    public int getCurrentDataConnectionState() {
-        return cdmaDataConnectionState;
-    }
-
-    /**
      * code is registration state 0-5 from TS 27.007 7.2
      * returns true if registered roam, false otherwise
      */
@@ -1668,7 +1662,7 @@
      * @return true if phone is camping on a technology
      * that could support voice and data simultaneously.
      */
-    public boolean isConcurrentVoiceAndDataAllowed() {
+    boolean isConcurrentVoiceAndData() {
         // Note: it needs to be confirmed which CDMA network types
         // can support voice and data calls concurrently.
         // For the time-being, the return value will be false.
diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
index 3f1a91b..c17197e 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -33,7 +33,6 @@
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
-import com.android.internal.telephony.CallTracker;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -73,7 +72,6 @@
 import com.android.internal.telephony.UUSInfo;
 import com.android.internal.telephony.test.SimulatedRadioControl;
 import com.android.internal.telephony.IccVmNotSupportedException;
-import com.android.internal.telephony.ServiceStateTracker;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -102,6 +100,9 @@
     // Instance Variables
     GsmCallTracker mCT;
     GsmServiceStateTracker mSST;
+    GsmSMSDispatcher mSMS;
+    SIMRecords mSIMRecords;
+    SimCard mSimCard;
     CatService mStkService;
     ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
     SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
@@ -282,14 +283,6 @@
         return mSIMRecords.getVoiceCallForwardingFlag();
     }
 
-    public CallTracker getCallTracker() {
-        return mCT;
-    }
-
-    public ServiceStateTracker getServiceStateTracker() {
-        return mSST;
-    }
-
     public List<? extends MmiCode>
     getPendingMmiCodes() {
         return mPendingMMIs;
@@ -321,7 +314,7 @@
                 case CONNECTED:
                 case DISCONNECTING:
                     if ( mCT.state != Phone.State.IDLE
-                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
+                            && !mSST.isConcurrentVoiceAndData()) {
                         ret = DataState.SUSPENDED;
                     } else {
                         ret = DataState.CONNECTED;
@@ -411,7 +404,7 @@
         mNotifier.notifySignalStrength(this);
     }
 
-    public void
+    /*package*/ void
     notifyDataConnectionFailed(String reason, String apnType) {
         mNotifier.notifyDataConnectionFailed(this, reason, apnType);
     }
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
index 9f7673c..4689b2d 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
@@ -19,12 +19,10 @@
 import android.os.Message;
 import android.util.Log;
 import android.util.Patterns;
-import android.text.TextUtils;
 
 import com.android.internal.telephony.ApnSetting;
 import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.RetryManager;
 
@@ -38,10 +36,8 @@
     //***** Instance Variables
     private ApnSetting apn;
 
-    protected int mProfileId = RILConstants.DATA_PROFILE_DEFAULT;
-    protected String mActiveApnType = Phone.APN_TYPE_DEFAULT;
     //***** Constructor
-    private GsmDataConnection(PhoneBase phone, String name, RetryManager rm) {
+    private GsmDataConnection(GSMPhone phone, String name, RetryManager rm) {
         super(phone, name, rm);
     }
 
@@ -53,7 +49,7 @@
      * @param rm the RetryManager
      * @return GsmDataConnection that was created.
      */
-    static GsmDataConnection makeDataConnection(PhoneBase phone, int id, RetryManager rm) {
+    static GsmDataConnection makeDataConnection(GSMPhone phone, int id, RetryManager rm) {
         synchronized (mCountLock) {
             mCount += 1;
         }
@@ -106,29 +102,11 @@
 
         phone.mCM.setupDataCall(
                 Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
-                Integer.toString(mProfileId),
-                apn.apn, apn.user, apn.password,
-                Integer.toString(authType),
+                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
+                apn.apn, apn.user, apn.password, Integer.toString(authType),
                 protocol, msg);
     }
 
-    public void setProfileId(int profileId) {
-        mProfileId = profileId;
-    }
-
-    public int getProfileId() {
-        return mProfileId;
-    }
-
-    public int getCid() {
-        // 'cid' has been defined in parent class
-        return cid;
-    }
-
-    public void setActiveApnType(String apnType) {
-        mActiveApnType = apnType;
-    }
-
     @Override
     protected void clearSettings() {
         super.clearSettings();
@@ -172,35 +150,17 @@
     }
 
     private void setHttpProxy(String httpProxy, String httpPort) {
-
-        if (DBG) log("set http proxy for"
-                + "' APN: '" + mActiveApnType
-                + "' proxy: '" + apn.proxy + "' port: '" + apn.port);
-        if(TextUtils.equals(mActiveApnType, Phone.APN_TYPE_DEFAULT)) {
-            if (httpProxy == null || httpProxy.length() == 0) {
-                phone.setSystemProperty("net.gprs.http-proxy", null);
-                return;
-            }
-
-            if (httpPort == null || httpPort.length() == 0) {
-                httpPort = "8080";     // Default to port 8080
-            }
-
-            phone.setSystemProperty("net.gprs.http-proxy",
-                    "http://" + httpProxy + ":" + httpPort + "/");
-        } else {
-            if (httpProxy == null || httpProxy.length() == 0) {
-                phone.setSystemProperty("net.gprs.http-proxy." + mActiveApnType, null);
-                return;
-            }
-
-            if (httpPort == null || httpPort.length() == 0) {
-                httpPort = "8080";  // Default to port 8080
-            }
-
-            phone.setSystemProperty("net.gprs.http-proxy." + mActiveApnType,
-                    "http://" + httpProxy + ":" + httpPort + "/");
+        if (httpProxy == null || httpProxy.length() == 0) {
+            phone.setSystemProperty("net.gprs.http-proxy", null);
+            return;
         }
+
+        if (httpPort == null || httpPort.length() == 0) {
+            httpPort = "8080";     // Default to port 8080
+        }
+
+        phone.setSystemProperty("net.gprs.http-proxy",
+                "http://" + httpProxy + ":" + httpPort + "/");
     }
 
     private boolean isIpAddress(String address) {
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 8c10c56..c57f2f1 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -22,14 +22,11 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.ProxyProperties;
 import android.net.TrafficStats;
 import android.net.Uri;
-import android.net.LinkCapabilities;
-import android.net.LinkProperties;
 import android.os.AsyncResult;
 import android.os.Message;
 import android.os.SystemClock;
@@ -39,32 +36,24 @@
 import android.telephony.ServiceState;
 import android.telephony.TelephonyManager;
 import android.telephony.gsm.GsmCellLocation;
-import android.text.TextUtils;
 import android.util.EventLog;
 import android.util.Log;
-import android.preference.PreferenceManager;
 
 import com.android.internal.R;
-import com.android.internal.telephony.ApnContext;
 import com.android.internal.telephony.ApnSetting;
 import com.android.internal.telephony.DataCallState;
 import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.DataConnectionTracker;
 import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.RetryManager;
 import com.android.internal.telephony.EventLogTags;
 import com.android.internal.telephony.DataConnection.FailCause;
-import com.android.internal.telephony.RILConstants;
 
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.Iterator;
-import java.util.Map;
 import java.util.HashMap;
 
 /**
@@ -73,6 +62,7 @@
 public final class GsmDataConnectionTracker extends DataConnectionTracker {
     protected final String LOG_TAG = "GSM";
 
+    private GSMPhone mGsmPhone;
     /**
      * Handles changes to the APN db.
      */
@@ -110,15 +100,22 @@
      */
     private ArrayList<ApnSetting> mAllApns = null;
 
+    /**
+     * waitingApns holds all apns that are waiting to be connected
+     *
+     * It is a subset of allApns and has the same format
+     */
+    private ArrayList<ApnSetting> mWaitingApns = null;
+    private int mWaitingApnsPermanentFailureCountDown = 0;
     private ApnSetting mPreferredApn = null;
 
+      /** The DataConnection being setup */
+    private GsmDataConnection mPendingDataConnection;
+
     /** Convert an ApnType string to Id (TODO: Use "enumeration" instead of String for ApnType) */
     private HashMap<String, Integer> mApnToDataConnectionId =
                                     new HashMap<String, Integer>();
 
-    /** Phone.APN_TYPE_* ===> ApnContext */
-    private ConcurrentHashMap<String, ApnContext> mApnContexts;
-
     /** Is packet service restricted by network */
     private boolean mIsPsRestricted = false;
 
@@ -127,55 +124,32 @@
     private static final int POLL_PDP_MILLIS = 5 * 1000;
 
     private static final String INTENT_RECONNECT_ALARM = "com.android.internal.telephony.gprs-reconnect";
-    private static final String INTENT_RECONNECT_ALARM_EXTRA_TYPE = "type";
 
     static final Uri PREFERAPN_URI = Uri.parse("content://telephony/carriers/preferapn");
     static final String APN_ID = "apn_id";
     private boolean canSetPreferApn = false;
 
-    @Override
-    protected void onActionIntentReconnectAlarm(Intent intent) {
-        log("GPRS reconnect alarm. Previous state was " + mState);
-
-        String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
-        String type = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE);
-        ApnContext apnContext = mApnContexts.get(type);
-        if (apnContext != null) {
-            apnContext.setReason(reason);
-            if (apnContext.getState() == State.FAILED) {
-                Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
-                msg.arg1 = 0; // tearDown is false
-                msg.obj = (ApnContext)apnContext;
-                sendMessage(msg);
-            }
-            sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext));
-        }
-    }
-
     /** Watches for changes to the APN db. */
     private ApnChangeObserver mApnObserver;
 
     //***** Constructor
 
-    public GsmDataConnectionTracker(PhoneBase p) {
+    GsmDataConnectionTracker(GSMPhone p) {
         super(p);
+        mGsmPhone = p;
 
         p.mCM.registerForAvailable (this, EVENT_RADIO_AVAILABLE, null);
         p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
         p.mSIMRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
         p.mCM.registerForDataNetworkStateChanged (this, EVENT_DATA_STATE_CHANGED, null);
-        p.getCallTracker().registerForVoiceCallEnded (this, EVENT_VOICE_CALL_ENDED, null);
-        p.getCallTracker().registerForVoiceCallStarted (this, EVENT_VOICE_CALL_STARTED, null);
-        p.getServiceStateTracker().registerForDataConnectionAttached(this,
-                EVENT_DATA_CONNECTION_ATTACHED, null);
-        p.getServiceStateTracker().registerForDataConnectionDetached(this,
-                EVENT_DATA_CONNECTION_DETACHED, null);
-        p.getServiceStateTracker().registerForRoamingOn(this, EVENT_ROAMING_ON, null);
-        p.getServiceStateTracker().registerForRoamingOff(this, EVENT_ROAMING_OFF, null);
-        p.getServiceStateTracker().registerForPsRestrictedEnabled(this,
-                EVENT_PS_RESTRICT_ENABLED, null);
-        p.getServiceStateTracker().registerForPsRestrictedDisabled(this,
-                EVENT_PS_RESTRICT_DISABLED, null);
+        p.mCT.registerForVoiceCallEnded (this, EVENT_VOICE_CALL_ENDED, null);
+        p.mCT.registerForVoiceCallStarted (this, EVENT_VOICE_CALL_STARTED, null);
+        p.mSST.registerForGprsAttached(this, EVENT_GPRS_ATTACHED, null);
+        p.mSST.registerForGprsDetached(this, EVENT_GPRS_DETACHED, null);
+        p.mSST.registerForRoamingOn(this, EVENT_ROAMING_ON, null);
+        p.mSST.registerForRoamingOff(this, EVENT_ROAMING_OFF, null);
+        p.mSST.registerForPsRestrictedEnabled(this, EVENT_PS_RESTRICT_ENABLED, null);
+        p.mSST.registerForPsRestrictedDisabled(this, EVENT_PS_RESTRICT_DISABLED, null);
 
         mDataConnectionTracker = this;
         mResolver = mPhone.getContext().getContentResolver();
@@ -185,8 +159,7 @@
                 Telephony.Carriers.CONTENT_URI, true, mApnObserver);
 
         /** Create the default connection */
-        mApnContexts = new ConcurrentHashMap<String, ApnContext>();
-        initApncontextsAndDataConnection();
+        createDataConnection(Phone.APN_TYPE_DEFAULT);
         broadcastMessenger();
     }
 
@@ -197,44 +170,22 @@
         //Unregister for all events
         mPhone.mCM.unregisterForAvailable(this);
         mPhone.mCM.unregisterForOffOrNotAvailable(this);
-        mPhone.mSIMRecords.unregisterForRecordsLoaded(this);
+        mGsmPhone.mSIMRecords.unregisterForRecordsLoaded(this);
         mPhone.mCM.unregisterForDataNetworkStateChanged(this);
-        mPhone.getCallTracker().unregisterForVoiceCallEnded(this);
-        mPhone.getCallTracker().unregisterForVoiceCallStarted(this);
-        mPhone.getServiceStateTracker().unregisterForDataConnectionAttached(this);
-        mPhone.getServiceStateTracker().unregisterForDataConnectionDetached(this);
-        mPhone.getServiceStateTracker().unregisterForRoamingOn(this);
-        mPhone.getServiceStateTracker().unregisterForRoamingOff(this);
-        mPhone.getServiceStateTracker().unregisterForPsRestrictedEnabled(this);
-        mPhone.getServiceStateTracker().unregisterForPsRestrictedDisabled(this);
+        mGsmPhone.mCT.unregisterForVoiceCallEnded(this);
+        mGsmPhone.mCT.unregisterForVoiceCallStarted(this);
+        mGsmPhone.mSST.unregisterForGprsAttached(this);
+        mGsmPhone.mSST.unregisterForGprsDetached(this);
+        mGsmPhone.mSST.unregisterForRoamingOn(this);
+        mGsmPhone.mSST.unregisterForRoamingOff(this);
+        mGsmPhone.mSST.unregisterForPsRestrictedEnabled(this);
+        mGsmPhone.mSST.unregisterForPsRestrictedDisabled(this);
 
         mPhone.getContext().getContentResolver().unregisterContentObserver(this.mApnObserver);
-        mApnContexts.clear();
 
         destroyDataConnections();
     }
 
-    /**
-     * The only circumstances under which we report that data connectivity is not
-     * possible are
-     * <ul>
-     * <li>Data is disallowed (roaming, power state, voice call, etc).</li>
-     * <li>The current data state is {@code DISCONNECTED} for a reason other than
-     * having explicitly disabled connectivity. In other words, data is not available
-     * because the phone is out of coverage or some like reason.</li>
-     * </ul>
-     * @return {@code true} if data connectivity is possible, {@code false} otherwise.
-     */
-    @Override
-    protected boolean isDataPossible() {
-        boolean possible = (isDataAllowed()
-                && getAnyDataEnabled() && (getOverallState() == State.CONNECTED));
-        if (!possible && DBG && isDataAllowed()) {
-            log("Data not possible.  No coverage: dataState = " + getOverallState());
-        }
-        return possible;
-    }
-
     @Override
     protected void finalize() {
         if(DBG) log("finalize");
@@ -245,225 +196,41 @@
         return INTENT_RECONNECT_ALARM;
     }
 
-    protected void initApncontextsAndDataConnection() {
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
-        boolean defaultEnabled = !sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
-        // create default type context only if enabled
-        if (defaultEnabled) {
-            ApnContext apnContext = new ApnContext(Phone.APN_TYPE_DEFAULT, LOG_TAG);
-            mApnContexts.put(apnContext.getApnType(), apnContext);
-            createDataConnection(Phone.APN_TYPE_DEFAULT);
-        }
-    }
-
     @Override
-    protected LinkProperties getLinkProperties(String apnType) {
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext != null && apnContext.getDataConnection() != null) {
-             if (DBG) log("get active pdp is not null, return link properites for " + apnType);
-             return apnContext.getDataConnection().getLinkProperties();
-        } else {
-            if (DBG) log("return new LinkProperties");
-            return new LinkProperties();
-        }
-    }
-
-    @Override
-    protected LinkCapabilities getLinkCapabilities(String apnType) {
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext!=null && apnContext.getDataConnection() != null) {
-             if (DBG) log("get active pdp is not null, return link Capabilities for " + apnType);
-             return apnContext.getDataConnection().getLinkCapabilities();
-        } else {
-            if (DBG) log("return new LinkCapabilities");
-            return new LinkCapabilities();
-        }
-    }
-
-    @Override
-    // Return all active apn types
-    public synchronized String[] getActiveApnTypes() {
-        if (DBG) log("get all active apn types");
-        ArrayList<String> result = new ArrayList<String>();
-
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-                result.add(apnContext.getApnType());
+    protected void setState(State s) {
+        if (DBG) log ("setState: " + s);
+        if (mState != s) {
+            EventLog.writeEvent(EventLogTags.GSM_DATA_STATE_CHANGE, mState.toString(), s.toString());
+            mState = s;
         }
 
-        return (String[])result.toArray(new String[0]);
-    }
-
-    @Override
-    /**
-     * Return DEFAULT APN due to the limit of the interface
-     */
-    public synchronized String getActiveApnString() {
-        if (DBG) log( "get default active apn string");
-        ApnContext defaultApnContext = mApnContexts.get(Phone.APN_TYPE_DEFAULT);
-        if (defaultApnContext != null && defaultApnContext.getApnSetting() != null) {
-            return defaultApnContext.getApnSetting().apn;
-        }
-        return null;
-    }
-
-    // Return active apn of specific apn type
-    public synchronized String getActiveApnString(String apnType) {
-        if (DBG) log( "get active apn string for type:" + apnType);
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext != null && apnContext.getApnSetting() != null) {
-            return apnContext.getApnSetting().apn;
-        }
-        return null;
-    }
-
-    // Return state of specific apn type
-    public synchronized State getState(String apnType) {
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext != null) {
-            return apnContext.getState();
-        }
-        return State.FAILED;
-    }
-
-    // Return state of overall
-    public State getOverallState() {
-        boolean isConnecting = false;
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-            if (apnContext.getState() == State.CONNECTED ||
-                    apnContext.getState() == State.DISCONNECTING) {
-                if (DBG) log("overall state is CONNECTED");
-                return State.CONNECTED;
-            }
-            else if (apnContext.getState() == State.CONNECTING
-                    || apnContext.getState() == State.INITING) {
-                isConnecting = true;
-            }
-        }
-        if (isConnecting) {
-            if (DBG) log( "overall state is CONNECTING");
-            return State.CONNECTING;
-        } else {
-            if (DBG) log( "overall state is IDLE");
-            return State.IDLE;
+        if (mState == State.FAILED) {
+            if (mWaitingApns != null)
+                mWaitingApns.clear(); // when tear down the connection and set to IDLE
         }
     }
 
     /**
-     * Ensure that we are connected to an APN of the specified type.
+     * The data connection is expected to be setup while device
+     *  1. has sim card
+     *  2. registered to gprs service
+     *  3. user doesn't explicitly disable data service
+     *  4. wifi is not on
      *
-     * @param type the APN type
-     * @return Success is indicated by {@code Phone.APN_ALREADY_ACTIVE} or
-     *         {@code Phone.APN_REQUEST_STARTED}. In the latter case, a
-     *         broadcast will be sent by the ConnectivityManager when a
-     *         connection to the APN has been established.
+     * @return false while no data connection if all above requirements are met.
      */
     @Override
-    public synchronized int enableApnType(String apnType) {
-        if (DBG) log("calling enableApnType with type:" + apnType);
+    public boolean isDataConnectionAsDesired() {
+        boolean roaming = mPhone.getServiceState().getRoaming();
 
-        if (!isApnTypeAvailable(apnType)) {
-            if (DBG) log("type not available");
-            return Phone.APN_TYPE_NOT_AVAILABLE;
+        if (mGsmPhone.mSIMRecords.getRecordsLoaded() &&
+                mGsmPhone.mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE &&
+                (!roaming || getDataOnRoamingEnabled()) &&
+            !mIsWifiConnected &&
+            !mIsPsRestricted ) {
+            return (mState == State.CONNECTED);
         }
-
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext==null) {
-            // Is there a Proxy type for this?
-            apnContext = getProxyActiveApnType(apnType);
-            if (apnContext != null ) {
-                notifyApnIdUpToCurrent(Phone.REASON_APN_SWITCHED, apnContext, apnType);
-                return Phone.APN_REQUEST_STARTED;
-            }
-            apnContext = new ApnContext(apnType, LOG_TAG);
-            if (DBG) log("New apn type context for type "+apnType);
-            mApnContexts.put(apnType, apnContext);
-        }
-
-        // If already active, return
-        log("enableApnType(" + apnType + ")" + ", mState(" + apnContext.getState() + ")");
-
-        if (apnContext.getState() == State.INITING) {
-            if (DBG) log("return APN_REQUEST_STARTED");
-            return Phone.APN_REQUEST_STARTED;
-        }
-        else if (apnContext.getState() == State.CONNECTED) {
-            if (DBG) log("return APN_ALREADY_ACTIVE");
-            return Phone.APN_ALREADY_ACTIVE;
-        }
-        else if (apnContext.getState() == State.DISCONNECTING) {
-            if (DBG) log("requested APN while disconnecting");
-            apnContext.setPendingAction(ApnContext.PENDING_ACTION_RECONNECT);
-            return Phone.APN_REQUEST_STARTED;
-        }
-
-        if (DBG) log("new apn request for type " + apnType + " is to be handled");
-        sendMessage(obtainMessage(EVENT_ENABLE_NEW_APN, apnContext));
-        if (DBG) log("return APN_REQUEST_STARTED");
-        return Phone.APN_REQUEST_STARTED;
-    }
-
-    // Returns for ex: if HIGHPRI is supported by DEFAULT
-    public ApnContext getProxyActiveApnType(String type) {
-
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-
-        while(it.hasNext()) {
-            ApnContext apnContext = it.next();
-            if (apnContext.getApnSetting() != null && mActiveApn.canHandleType(type))
-            return apnContext;
-        }
-        return null;
-    }
-
-    // A new APN has gone active and needs to send events to catch up with the
-    // current condition
-    private void notifyApnIdUpToCurrent(String reason, ApnContext apnContext, String type) {
-        switch (apnContext.getState()) {
-            case IDLE:
-            case INITING:
-                break;
-            case CONNECTING:
-            case SCANNING:
-                mPhone.notifyDataConnection(reason, type, Phone.DataState.CONNECTING);
-                break;
-            case CONNECTED:
-            case DISCONNECTING:
-                mPhone.notifyDataConnection(reason, type, Phone.DataState.CONNECTING);
-                mPhone.notifyDataConnection(reason, type, Phone.DataState.CONNECTED);
-                break;
-        }
-    }
-
-    @Override
-    public synchronized int disableApnType(String type) {
-        if (DBG) log("calling disableApnType with type:" + type);
-        ApnContext apnContext = mApnContexts.get(type);
-
-        if (apnContext != null) {
-            apnContext.setPendingAction(ApnContext.PENDING_ACTION_APN_DISABLE);
-
-            if (apnContext.getState() != State.IDLE && apnContext.getState() != State.FAILED) {
-                Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
-                msg.arg1 = 1; // tearDown is true;
-                apnContext.setReason(Phone.REASON_DATA_DISABLED);
-                msg.obj = apnContext;
-                sendMessage(msg);
-                if (DBG) log("return APN_REQUEST_STARTED");
-                return Phone.APN_REQUEST_STARTED;
-            } else {
-                if (DBG) log("return APN_ALREADY_INACTIVE");
-                return Phone.APN_ALREADY_INACTIVE;
-            }
-
-        } else {
-            if (DBG)
-                log("no apn context was found, return APN_REQUEST_FAILED");
-            return Phone.APN_REQUEST_FAILED;
-        }
+        return true;
     }
 
     @Override
@@ -482,53 +249,12 @@
         return false;
     }
 
-    protected boolean isEnabled(String apnType) {
-        ApnContext apnContext = mApnContexts.get(apnType);
-        if (apnContext == null) return false;
-        if (apnContext.getState() == State.DISCONNECTING
-                && apnContext.getPendingAction() == ApnContext.PENDING_ACTION_APN_DISABLE) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Report on whether data connectivity is enabled for any APN.
-     * @return {@code false} if data connectivity has been explicitly disabled,
-     * {@code true} otherwise.
-     */
-    @Override
-    public synchronized boolean getAnyDataEnabled() {
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-
-        if (!(mInternalDataEnabled && mDataEnabled)) return false;
-        if (mApnContexts.isEmpty()) return false;
-        while (it.hasNext()) {
-            ApnContext apnContext= it.next();
-            // Make sure we dont have a context that going down
-            // and is explicitly disabled.
-            if (!(apnContext.getState() == State.DISCONNECTING
-                    && apnContext.getPendingAction() == ApnContext.PENDING_ACTION_APN_DISABLE)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean isDataAllowed(ApnContext apnContext) {
-        if(apnContext.getState() == State.DISCONNECTING
-                && apnContext.getPendingAction() == ApnContext.PENDING_ACTION_APN_DISABLE) {
-            return false;
-        }
-        return isDataAllowed();
-    }
-
     //****** Called from ServiceStateTracker
     /**
      * Invoked when ServiceStateTracker observes a transition from GPRS
      * attach to detach.
      */
-    protected void onDataConnectionDetached() {
+    protected void onGprsDetached() {
         /*
          * We presently believe it is unnecessary to tear down the PDP context
          * when GPRS detaches, but we should stop the network polling.
@@ -537,29 +263,27 @@
         notifyDataConnection(Phone.REASON_GPRS_DETACHED);
     }
 
-    private void onDataConnectionAttached() {
-        if (getOverallState() == State.CONNECTED) {
+    private void onGprsAttached() {
+        if (mState == State.CONNECTED) {
             startNetStatPoll();
             notifyDataConnection(Phone.REASON_GPRS_ATTACHED);
         } else {
-            // Only check for default APN state
-            ApnContext defaultApnContext = mApnContexts.get(Phone.APN_TYPE_DEFAULT);
-            if (defaultApnContext.getState() == State.FAILED) {
-                cleanUpConnection(false, defaultApnContext);
+            if (mState == State.FAILED) {
+                cleanUpConnection(false, Phone.REASON_GPRS_ATTACHED);
                 mRetryMgr.resetRetryCount();
             }
-            trySetupData(Phone.REASON_GPRS_ATTACHED, Phone.APN_TYPE_DEFAULT);
+            trySetupData(Phone.REASON_GPRS_ATTACHED);
         }
     }
 
     @Override
     protected boolean isDataAllowed() {
-        int gprsState = mPhone.getServiceStateTracker().getCurrentDataConnectionState();
-        boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
+        int gprsState = mGsmPhone.mSST.getCurrentGprsState();
+        boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState();
 
         boolean allowed =
                     (gprsState == ServiceState.STATE_IN_SERVICE || mAutoAttachOnCreation) &&
-                    mPhone.mSIMRecords.getRecordsLoaded() &&
+                    mGsmPhone.mSIMRecords.getRecordsLoaded() &&
                     mPhone.getState() == Phone.State.IDLE &&
                     mInternalDataEnabled &&
                     (!mPhone.getServiceState().getRoaming() || getDataOnRoamingEnabled()) &&
@@ -570,7 +294,7 @@
             if (!((gprsState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
                 reason += " - gprs= " + gprsState;
             }
-            if (!mPhone.mSIMRecords.getRecordsLoaded()) reason += " - SIM not loaded";
+            if (!mGsmPhone.mSIMRecords.getRecordsLoaded()) reason += " - SIM not loaded";
             if (mPhone.getState() != Phone.State.IDLE) {
                 reason += " - PhoneState= " + mPhone.getState();
             }
@@ -585,198 +309,94 @@
         return allowed;
     }
 
-    private boolean trySetupData(String reason, String type) {
-        if (DBG)
-            log("***trySetupData for type:" + type+" due to " + (reason == null ? "(unspecified)" : reason));
-        log("[DSAC DEB] " + "trySetupData with mIsPsRestricted=" + mIsPsRestricted);
+    private boolean trySetupData(String reason) {
+        if (DBG) log("***trySetupData due to " + (reason == null ? "(unspecified)" : reason));
 
-        if (type == null) {
-            type = Phone.APN_TYPE_DEFAULT;
-        }
-
-        ApnContext apnContext = mApnContexts.get(type);
-
-        if (apnContext == null ){
-            if (DBG) log("***new apn context for type:" + type);
-            apnContext = new ApnContext(type, LOG_TAG);
-            if (apnContext == null) {
-                if (DBG) log("***new apn context failed ");
-                return false;
-            }
-            mApnContexts.put(type, apnContext);
-        }
-        apnContext.setReason(reason);
-
-        return trySetupData(apnContext);
-
-    }
-
-    @Override
-    protected void setState(State s) {
-        if (DBG) log("setState should not be used in GSM" + s);
-    }
-
-    private boolean trySetupData(ApnContext apnContext) {
-
-        if (DBG)
-            log("trySetupData for type:" + apnContext.getApnType() +
-                " due to " + apnContext.getReason());
         log("[DSAC DEB] " + "trySetupData with mIsPsRestricted=" + mIsPsRestricted);
 
         if (mPhone.getSimulatedRadioControl() != null) {
             // Assume data is connected on the simulator
             // FIXME  this can be improved
-            apnContext.setState(State.CONNECTED);
-            mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
+            setState(State.CONNECTED);
+            notifyDataConnection(reason);
 
             log("(fix?) We're on the simulator; assuming data is connected");
             return true;
         }
 
-        boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
+        int gprsState = mGsmPhone.mSST.getCurrentGprsState();
+        boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState();
 
-        if ((apnContext.getState() == State.IDLE || apnContext.getState() == State.SCANNING) &&
-                isDataAllowed(apnContext) && getAnyDataEnabled()) {
+        if (((mState == State.IDLE) || (mState == State.SCANNING)) &&
+                isDataAllowed() && getAnyDataEnabled()) {
 
-            if (apnContext.getState() == State.IDLE) {
-                ArrayList<ApnSetting> waitingApns = buildWaitingApns(apnContext.getApnType());
-                if (waitingApns.isEmpty()) {
+            if (mState == State.IDLE) {
+                mWaitingApns = buildWaitingApns(mRequestedApnType);
+                mWaitingApnsPermanentFailureCountDown = mWaitingApns.size();
+                if (mWaitingApns.isEmpty()) {
                     if (DBG) log("No APN found");
-                    notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN, apnContext);
-                    notifyOffApnsOfAvailability(apnContext.getReason(), false);
+                    notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
+                    notifyOffApnsOfAvailability(reason, false);
                     return false;
                 } else {
-                    apnContext.setWaitingApns(waitingApns);
-                    log ("Create from mAllApns : " + apnListToString(mAllApns));
+                    log ("Create from allApns : " + apnListToString(mAllApns));
                 }
             }
 
             if (DBG) {
-                log ("Setup watingApns : " + apnListToString(apnContext.getWaitingApns()));
+                log ("Setup waitngApns : " + apnListToString(mWaitingApns));
             }
-            // apnContext.setReason(apnContext.getReason());
-            boolean retValue = setupData(apnContext);
-            notifyOffApnsOfAvailability(apnContext.getReason(), retValue);
+            boolean retValue = setupData(reason);
+            notifyOffApnsOfAvailability(reason, retValue);
             return retValue;
         } else {
-            // TODO: check the condition.
-            if (!apnContext.getApnType().equals(Phone.APN_TYPE_DEFAULT)
-                && (apnContext.getState() == State.IDLE
-                    || apnContext.getState() == State.SCANNING))
-                mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType());
-            notifyOffApnsOfAvailability(apnContext.getReason(), false);
+            notifyOffApnsOfAvailability(reason, false);
             return false;
         }
     }
 
-    @Override
-    // Disabled apn's still need avail/unavail notificiations - send them out
-    protected void notifyOffApnsOfAvailability(String reason, boolean availability) {
-        if (mAvailability == availability) return;
-        mAvailability = availability;
-
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-            // FIXME: Dont understand why this needs to be done!!
-            // This information is not available (DISABLED APNS)
-            if (false) {
-                if (DBG) log("notify disconnected for type:" + apnContext.getApnType());
-                mPhone.notifyDataConnection(reason != null ? reason : apnContext.getReason(),
-                                            apnContext.getApnType(),
-                                            Phone.DataState.DISCONNECTED);
-            }
-        }
-    }
-
-    /**
-     * If tearDown is true, this only tears down a CONNECTED session. Presently,
-     * there is no mechanism for abandoning an INITING/CONNECTING session,
-     * but would likely involve cancelling pending async requests or
-     * setting a flag or new state to ignore them when they came in
-     * @param tearDown true if the underlying GsmDataConnection should be
-     * disconnected.
-     * @param reason reason for the clean up.
-     */
-    protected void cleanUpAllConnections(boolean tearDown, String reason) {
-        if (DBG) log("Clean up all connections due to " + reason);
-
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-                apnContext.setReason(reason);
-            cleanUpConnection(tearDown, apnContext);
-        }
-
-        stopNetStatPoll();
-        // TODO: Do we need mRequestedApnType?
-        mRequestedApnType = Phone.APN_TYPE_DEFAULT;
-    }
-
     /**
      * Cleanup all connections.
      *
      * TODO: Cleanup only a specified connection passed as a parameter.
-     *       Also, make sure when you clean up a conn, if it is last apply
-     *       logic as though it is cleanupAllConnections
      *
      * @param tearDown true if the underlying DataConnection should be disconnected.
      * @param reason for the clean up.
      */
-
-    @Override
-    protected void onCleanUpAllConnections() {
-        cleanUpAllConnections(true, null);
-    }
-
-    private void cleanUpConnection(boolean tearDown, ApnContext apnContext) {
-
-        if (apnContext == null) {
-            if (DBG) log("apn context is null");
-            return;
-        }
-
-        if (DBG) log("Clean up connection due to " + apnContext.getReason());
+    private void cleanUpConnection(boolean tearDown, String reason) {
+        if (DBG) log("Clean up connection due to " + reason);
 
         // Clear the reconnect alarm, if set.
-        if (apnContext.getReconnectIntent() != null) {
+        if (mReconnectIntent != null) {
             AlarmManager am =
                 (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
-            am.cancel(apnContext.getReconnectIntent());
-            apnContext.setReconnectIntent(null);
+            am.cancel(mReconnectIntent);
+            mReconnectIntent = null;
         }
 
-        if (apnContext.getState() == State.IDLE || apnContext.getState() == State.DISCONNECTING) {
-            if (DBG) log("state is in " + apnContext.getState());
-            return;
-        }
+        setState(State.DISCONNECTING);
 
-        if (apnContext.getState() == State.FAILED) {
-            if (DBG) log("state is in FAILED");
-            apnContext.setState(State.IDLE);
-            return;
+        boolean notificationDeferred = false;
+        for (DataConnection conn : mDataConnections.values()) {
+            if (tearDown) {
+                if (DBG) log("cleanUpConnection: teardown, call conn.disconnect");
+                conn.disconnect(obtainMessage(EVENT_DISCONNECT_DONE,
+                        conn.getDataConnectionId(), 0, reason));
+                notificationDeferred = true;
+            } else {
+                if (DBG) log("cleanUpConnection: !tearDown, call conn.resetSynchronously");
+                conn.resetSynchronously();
+                notificationDeferred = false;
+            }
         }
+        stopNetStatPoll();
 
-        GsmDataConnection pdp = apnContext.getDataConnection();
-        if (tearDown && pdp!=null) {
-            apnContext.setState(State.DISCONNECTING);
-            Message msg = obtainMessage(EVENT_DISCONNECT_DONE, apnContext);
-            pdp.disconnect(msg);
-            return;
-        } else if (pdp != null) {
-            pdp.clearSettings();
-        }
-
-        if (!tearDown) {
-            apnContext.setState(State.IDLE);
-            mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
-        }
-        if (apnContext.getPendingAction() == ApnContext.PENDING_ACTION_APN_DISABLE) {
-           mApnContexts.remove(apnContext.getApnType());
+        if (!notificationDeferred) {
+            if (DBG) log("cleanupConnection: !notificationDeferred");
+            gotoIdleAndNotifyDataConnection(reason);
         }
     }
 
-
     /**
      * @param types comma delimited list of APN types
      * @return array of APN types
@@ -799,8 +419,6 @@
             do {
                 String[] types = parseTypes(
                         cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE)));
-                int enabled =
-                    cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.ENABLED));
                 ApnSetting apn = new ApnSetting(
                         cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)),
                         cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)),
@@ -817,11 +435,7 @@
                         types,
                         cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)),
                         cursor.getString(cursor.getColumnIndexOrThrow(
-                                Telephony.Carriers.ROAMING_PROTOCOL)),
-                        (enabled == 0 ? false : true),
-                        cursor.getInt(cursor.getColumnIndexOrThrow(
-                                Telephony.Carriers.INACTIVE_TIMER)),
-                        cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.CLASS)));
+                                Telephony.Carriers.ROAMING_PROTOCOL)));
                 result.add(apn);
             } while (cursor.moveToNext());
         }
@@ -839,71 +453,27 @@
         return null;
     }
 
-    protected GsmDataConnection findReadyDataConnection(ApnSetting apn) {
-        if (DBG)
-            log("findReadyDataConnection for apn string <" +
-                (apn!=null?(apn.toString()):"null") +">");
-        for (DataConnection conn : mDataConnections.values()) {
-            GsmDataConnection dc = (GsmDataConnection) conn;
-            if (DBG) log("dc apn string <" +
-                         (dc.getApn() != null ? (dc.getApn().toString()) : "null") + ">");
-            if (dc.getApn() != null && apn != null
-                && dc.getApn().toString().equals(apn.toString())) {
-                return dc;
-            }
-        }
-        return null;
-    }
-
-
-    private boolean setupData(ApnContext apnContext) {
-        if (DBG) log("enter setupData!");
+    private boolean setupData(String reason) {
         ApnSetting apn;
-        GsmDataConnection dc;
+        GsmDataConnection gdc;
 
-        int profileId = getApnProfileID(apnContext.getApnType());
-        apn = apnContext.getNextApn();
-        if (apn == null) {
-            if (DBG) log("setupData: return for no apn found!");
-            return false;
-        }
-
-        if (((mPhone.getServiceState().getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EHRPD)
-            || (mPhone.getServiceState().getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_LTE))
-            && (!apn.enabled)) {
-            if (DBG) log("setupData: apn is desabled by carrier!");
-            return false;
-        }
-
-        dc = findReadyDataConnection(apn);
-
-        if (dc == null) {
-            if (DBG) log("setupData: No ready GsmDataConnection found!");
-            // TODO: When allocating you are mapping type to id. If more than 1 free,
-            // then could findFreeDataConnection get the wrong one??
-            dc = findFreeDataConnection();
-        }
-
-        if (dc == null) {
+        apn = getNextApn();
+        if (apn == null) return false;
+        gdc = findFreeDataConnection();
+        if (gdc == null) {
             if (DBG) log("setupData: No free GsmDataConnection found!");
             return false;
         }
-
-        apnContext.setApnSetting(apn);
-        apnContext.setDataConnection(dc);
-        dc.setProfileId( profileId );
-        dc.setActiveApnType(apnContext.getApnType());
+        mActiveApn = apn;
+        mPendingDataConnection = gdc;
 
         Message msg = obtainMessage();
         msg.what = EVENT_DATA_SETUP_COMPLETE;
-        msg.obj = apnContext;
+        msg.obj = reason;
+        gdc.connect(msg, apn);
 
-        if (DBG) log("dc connect!");
-        dc.connect(msg, apn);
-
-        apnContext.setState(State.INITING);
-        mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
-        if (DBG) log("setupData: initing!");
+        setState(State.INITING);
+        notifyDataConnection(reason);
         return true;
     }
 
@@ -928,28 +498,24 @@
      * Handles changes to the APN database.
      */
     private void onApnChanged() {
-        // TODO: How to handle when multiple APNs are active?
         boolean isConnected;
 
-        ApnContext defaultApnContext = mApnContexts.get(Phone.APN_TYPE_DEFAULT);
-        isConnected = (defaultApnContext.getState() != State.IDLE
-                       && defaultApnContext.getState() != State.FAILED);
+        isConnected = (mState != State.IDLE && mState != State.FAILED);
 
-        if (mPhone instanceof GSMPhone) {
-            // The "current" may no longer be valid.  MMS depends on this to send properly. TBD
-            ((GSMPhone)mPhone).updateCurrentCarrierInProvider();
-        }
+        // The "current" may no longer be valid.  MMS depends on this to send properly.
+        mGsmPhone.updateCurrentCarrierInProvider();
 
         // TODO: It'd be nice to only do this if the changed entrie(s)
         // match the current operator.
         createAllApnList();
-        if (DBG) log("onApnChanged clean all connections");
-        cleanUpAllConnections(isConnected, Phone.REASON_APN_CHANGED);
-        if (!isConnected) {
-            // TODO: Won't work for multiple connections!!!!
-            mRetryMgr.resetRetryCount();
-            defaultApnContext.setReason(Phone.REASON_APN_CHANGED);
-            trySetupData(defaultApnContext);
+        if (mState != State.DISCONNECTING) {
+            cleanUpConnection(isConnected, Phone.REASON_APN_CHANGED);
+            if (!isConnected) {
+                // reset reconnect timer
+                mRetryMgr.resetRetryCount();
+                mReregisterOnReconnectFailure = false;
+                trySetupData(Phone.REASON_APN_CHANGED);
+            }
         }
     }
 
@@ -971,46 +537,28 @@
             return;
         }
 
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-            onDataStateChanged(dataCallStates, explicitPoll, apnContext);
-        }
-    }
-
-    private void onDataStateChanged (ArrayList<DataCallState> dataCallStates,
-                                     boolean explicitPoll,
-                                     ApnContext apnContext) {
-
-        if (apnContext == null) {
-            // Should not happen
-            return;
-        }
-
-        if (apnContext.getState() == State.CONNECTED) {
+        if (mState == State.CONNECTED) {
             // The way things are supposed to work, the PDP list
             // should not contain the CID after it disconnects.
             // However, the way things really work, sometimes the PDP
             // context is still listed with active = false, which
             // makes it hard to distinguish an activating context from
             // an activated-and-then deactivated one.
-            if (!dataCallStatesHasCID(dataCallStates, apnContext.getDataConnection().getCid())) {
+            if (!dataCallStatesHasCID(dataCallStates, mCidActive)) {
                 // It looks like the PDP context has deactivated.
                 // Tear everything down and try to reconnect.
 
-                Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting");
+                log("PDP connection has dropped. Reconnecting");
 
                 // Add an event log when the network drops PDP
-                int cid = -1;
                 GsmCellLocation loc = ((GsmCellLocation)mPhone.getCellLocation());
-                if (loc != null) cid = loc.getCid();
-                EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, cid,
+                EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP,
+                        loc != null ? loc.getCid() : -1,
                         TelephonyManager.getDefault().getNetworkType());
 
-                cleanUpConnection(true, apnContext);
+                cleanUpConnection(true, null);
                 return;
-            } else if (!dataCallStatesHasActiveCID(dataCallStates,
-                    apnContext.getDataConnection().getCid())) {
+            } else if (!dataCallStatesHasActiveCID(dataCallStates, mCidActive)) {
                 // Here, we only consider this authoritative if we asked for the
                 // PDP list. If it was an unsolicited response, we poll again
                 // to make sure everyone agrees on the initial state.
@@ -1020,37 +568,33 @@
                     mPhone.mCM.getPDPContextList(
                             this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE));
                 } else {
-                    Log.i(LOG_TAG, "PDP connection has dropped (active=false case). "
+                    log("PDP connection has dropped (active=false case). "
                                     + " Reconnecting");
 
                     // Log the network drop on the event log.
-                    int cid = -1;
                     GsmCellLocation loc = ((GsmCellLocation)mPhone.getCellLocation());
-                    if (loc != null) cid = loc.getCid();
-                    EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, cid,
+                    EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP,
+                            loc != null ? loc.getCid() : -1,
                             TelephonyManager.getDefault().getNetworkType());
 
-                    cleanUpConnection(true, apnContext);
+                    cleanUpConnection(true, null);
                 }
             }
         }
     }
 
-    private void notifyDefaultData(ApnContext apnContext) {
-        if (DBG)
-            log("notifyDefaultData for type: " + apnContext.getApnType()
-                + ", reason:" + apnContext.getReason());
-        apnContext.setState(State.CONNECTED);
-        // setState(State.CONNECTED);
-        mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
+    private void notifyDefaultData(String reason) {
+        setState(State.CONNECTED);
+        notifyDataConnection(reason);
         startNetStatPoll();
         // reset reconnect timer
         mRetryMgr.resetRetryCount();
+        mReregisterOnReconnectFailure = false;
     }
 
-    // TODO: For multiple Active APNs not exactly sure how to do this.
     private void gotoIdleAndNotifyDataConnection(String reason) {
         if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason);
+        setState(State.IDLE);
         notifyDataConnection(reason);
         mActiveApn = null;
     }
@@ -1064,18 +608,18 @@
     }
 
     private void doRecovery() {
-        if (getOverallState() == State.CONNECTED) {
+        if (mState == State.CONNECTED) {
             int maxPdpReset = Settings.Secure.getInt(mResolver,
                     Settings.Secure.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT,
                     DEFAULT_MAX_PDP_RESET_FAIL);
             if (mPdpResetCount < maxPdpReset) {
                 mPdpResetCount++;
                 EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET, mSentSinceLastRecv);
-                cleanUpAllConnections(true, Phone.REASON_PDP_RESET);
+                cleanUpConnection(true, Phone.REASON_PDP_RESET);
             } else {
                 mPdpResetCount = 0;
                 EventLog.writeEvent(EventLogTags.PDP_REREGISTER_NETWORK, mSentSinceLastRecv);
-                mPhone.getServiceStateTracker().reRegisterNetwork(null);
+                mGsmPhone.mSST.reRegisterNetwork(null);
             }
             // TODO: Add increasingly drastic recovery steps, eg,
             // reset the radio, reset the device.
@@ -1084,7 +628,7 @@
 
     @Override
     protected void startNetStatPoll() {
-        if (getOverallState() == State.CONNECTED && mNetStatPollEnabled == false) {
+        if (mState == State.CONNECTED && mNetStatPollEnabled == false) {
             log("[DataConnection] Start poll NetStat");
             resetPollStats();
             mNetStatPollEnabled = true;
@@ -1102,8 +646,8 @@
     @Override
     protected void restartRadio() {
         log("************TURN OFF RADIO**************");
-        cleanUpAllConnections(true, Phone.REASON_RADIO_TURNED_OFF);
-        mPhone.getServiceStateTracker().powerOffRadioSafely();
+        cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF);
+        mGsmPhone.mSST.powerOffRadioSafely();
         /* Note: no need to call setRadioPower(true).  Assuming the desired
          * radio power state is still ON (as tracked by ServiceStateTracker),
          * ServiceStateTracker will call setRadioPower when it receives the
@@ -1240,26 +784,24 @@
         return retry;
     }
 
-    private void reconnectAfterFail(FailCause lastFailCauseCode, ApnContext apnContext) {
-        if (apnContext == null) {
-            Log.d(LOG_TAG, "It is impossible");
-            return;
-        }
-        if (apnContext.getState() == State.FAILED) {
+    private void reconnectAfterFail(FailCause lastFailCauseCode, String reason) {
+        if (mState == State.FAILED) {
+            /** TODO: Retrieve retry manager from connection itself */
             if (!mRetryMgr.isRetryNeeded()) {
-                if (!apnContext.getApnType().equals(Phone.APN_TYPE_DEFAULT)){
+                if (!mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
                     // if no more retries on a secondary APN attempt, tell the world and revert.
                     notifyDataConnection(Phone.REASON_APN_FAILED);
+                    onEnableApn(apnTypeToId(mRequestedApnType), DISABLED);
                     return;
                 }
                 if (mReregisterOnReconnectFailure) {
-                    // We've re-registerd once now just retry forever.
+                    // We've re-registered once now just retry forever.
                     mRetryMgr.retryForeverUsingLastTimeout();
                 } else {
-                    // Try to Re-register to the network.
+                    // Try to re-register to the network.
                     log("PDP activate failed, Reregistering to the network");
                     mReregisterOnReconnectFailure = true;
-                    mPhone.getServiceStateTracker().reRegisterNetwork(null);
+                    mGsmPhone.mSST.reRegisterNetwork(null);
                     mRetryMgr.resetRetryCount();
                     return;
                 }
@@ -1272,61 +814,48 @@
             AlarmManager am =
                 (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
             Intent intent = new Intent(INTENT_RECONNECT_ALARM);
-            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, apnContext.getReason());
-            // Should put an extra of apn type?
-            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, apnContext.getApnType());
-            apnContext.setReconnectIntent(PendingIntent.getBroadcast (
-                    mPhone.getContext(), 0, intent, 0));
+            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason);
+            mReconnectIntent = PendingIntent.getBroadcast(
+                    mPhone.getContext(), 0, intent, 0);
             am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                     SystemClock.elapsedRealtime() + nextReconnectDelay,
-                    apnContext.getReconnectIntent());
+                    mReconnectIntent);
 
             mRetryMgr.increaseRetryCount();
 
             if (!shouldPostNotification(lastFailCauseCode)) {
-                Log.d(LOG_TAG, "NOT Posting GPRS Unavailable notification "
+                log("NOT Posting GPRS Unavailable notification "
                                 + "-- likely transient error");
             } else {
-                notifyNoData(lastFailCauseCode, apnContext);
+                notifyNoData(lastFailCauseCode);
             }
         }
     }
 
-    private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode,
-                              ApnContext apnContext) {
-        if (DBG) log( "notifyNoData for type:" + apnContext.getApnType());
-        apnContext.setState(State.FAILED);
-        if (lastFailCauseCode.isPermanentFail()
-            && (!apnContext.getApnType().equals(Phone.APN_TYPE_DEFAULT))) {
-            mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType());
-        }
+    private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode) {
+        setState(State.FAILED);
     }
 
     private void onRecordsLoaded() {
         createAllApnList();
-        ApnContext defaultApnContext = mApnContexts.get(Phone.APN_TYPE_DEFAULT);
-        if (defaultApnContext!=null ) {
-            defaultApnContext.setReason(Phone.REASON_SIM_LOADED);
-            if (defaultApnContext.getState() == State.FAILED) {
-                if (DBG) log("onRecordsLoaded clean connection");
-                cleanUpConnection(false, defaultApnContext);
-            }
-            sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA,defaultApnContext ));
+        if (mState == State.FAILED) {
+            cleanUpConnection(false, null);
         }
+        sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED));
     }
 
-    protected void onEnableNewApn(ApnContext apnContext ) {
+    @Override
+    protected void onEnableNewApn() {
+        log("onEnableNewApn E");
         // change our retry manager to use the appropriate numbers for the new APN
-        log("onEnableNewApn with ApnContext E");
-        if (apnContext.getApnType().equals(Phone.APN_TYPE_DEFAULT)) {
+        if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
             log("onEnableNewApn default type");
-            ApnContext defaultApnContext = mApnContexts.get(Phone.APN_TYPE_DEFAULT);
-            mRetryMgr = defaultApnContext.getDataConnection().getRetryMgr();
+            mRetryMgr = mPendingDataConnection.getRetryMgr();
             mRetryMgr.resetRetryCount();
-        } else if (mApnToDataConnectionId.get(apnContext.getApnType()) == null) {
-            log("onEnableNewApn ApnType=" + apnContext.getApnType() +
+        } else if (mApnToDataConnectionId.get(mRequestedApnType) == null) {
+            log("onEnableNewApn mRequestedApnType=" + mRequestedApnType +
                     " missing, make a new connection");
-            int id = createDataConnection(apnContext.getApnType());
+            int id = createDataConnection(mRequestedApnType);
             mRetryMgr = mDataConnections.get(id).getRetryMgr();
             mRetryMgr.resetRetryCount();
         } else {
@@ -1335,39 +864,27 @@
 
         // TODO:  To support simultaneous PDP contexts, this should really only call
         // cleanUpConnection if it needs to free up a GsmDataConnection.
-        if (DBG) log("onEnableNewApn setup data");
-        if (apnContext.getState() == State.FAILED) {
-            if (DBG) log("previous state is FAILED, reset to IDLE");
-            apnContext.setState(State.IDLE);
-        }
-        trySetupData(apnContext);
-        log("onEnableNewApn with ApnContext X");
+        cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
+        log("onEnableNewApn X");
     }
 
     @Override
-    // TODO: We shouldnt need this.
     protected boolean onTrySetupData(String reason) {
-        return trySetupData(reason, Phone.APN_TYPE_DEFAULT);
-    }
-
-    protected boolean onTrySetupData(ApnContext apnContext) {
-        return trySetupData(apnContext);
+        return trySetupData(reason);
     }
 
     @Override
-    // TODO: Need to understand if more than DEFAULT is impacted?
     protected void onRoamingOff() {
-        trySetupData(Phone.REASON_ROAMING_OFF, Phone.APN_TYPE_DEFAULT);
+        trySetupData(Phone.REASON_ROAMING_OFF);
     }
 
     @Override
-    // TODO: Need to understand if more than DEFAULT is impacted?
     protected void onRoamingOn() {
         if (getDataOnRoamingEnabled()) {
-            trySetupData(Phone.REASON_ROAMING_ON, Phone.APN_TYPE_DEFAULT);
+            trySetupData(Phone.REASON_ROAMING_ON);
         } else {
             if (DBG) log("Tear down data connection on roaming.");
-            cleanUpAllConnections(true, Phone.REASON_ROAMING_ON);
+            cleanUpConnection(true, Phone.REASON_ROAMING_ON);
         }
     }
 
@@ -1376,13 +893,13 @@
         if (mPhone.getSimulatedRadioControl() != null) {
             // Assume data is connected on the simulator
             // FIXME  this can be improved
-            // setState(State.CONNECTED);
+            setState(State.CONNECTED);
             notifyDataConnection(null);
 
             log("We're on the simulator; assuming data is connected");
         }
 
-        if (getOverallState() != State.IDLE) {
+        if (mState != State.IDLE) {
             cleanUpConnection(true, null);
         }
     }
@@ -1400,30 +917,28 @@
             log("We're on the simulator; assuming radio off is meaningless");
         } else {
             if (DBG) log("Radio is off and clean up all connection");
-            cleanUpAllConnections(false, Phone.REASON_RADIO_TURNED_OFF);
+            // TODO: Should we reset mRequestedApnType to "default"?
+            cleanUpConnection(false, Phone.REASON_RADIO_TURNED_OFF);
         }
     }
 
     @Override
     protected void onDataSetupComplete(AsyncResult ar) {
-
-        ApnContext apnContext = null;
-
-        if(ar.userObj instanceof ApnContext){
-            apnContext = (ApnContext)ar.userObj;
+        /** TODO: Which connection is completing should be a parameter */
+        String reason = null;
+        if (ar.userObj instanceof String) {
+            reason = (String) ar.userObj;
         }
 
         if (ar.exception == null) {
-            // Everything is setup
-            // TODO: We should clear LinkProperties/Capabilities when torn down or disconnected
-            if (DBG) {
-                log(String.format("onDataSetupComplete: success apn=%s",
-                    apnContext.getWaitingApns().get(0).apn));
+            if(DBG) {
+                log(String.format("onDataSetupComplete: success apn=%s", mWaitingApns.get(0).apn));
             }
-            mLinkProperties = getLinkProperties(apnContext.getDataConnection());
-            mLinkCapabilities = getLinkCapabilities(apnContext.getDataConnection());
+            // TODO: We should clear LinkProperties/Capabilities when torn down or disconnected
+            mLinkProperties = getLinkProperties(mPendingDataConnection);
+            mLinkCapabilities = getLinkCapabilities(mPendingDataConnection);
 
-            ApnSetting apn = apnContext.getDataConnection().getApn();
+            ApnSetting apn = mPendingDataConnection.getApn();
             if (apn.proxy != null && apn.proxy.length() != 0) {
                 try {
                     ProxyProperties proxy = new ProxyProperties(apn.proxy,
@@ -1436,34 +951,29 @@
             }
 
             // everything is setup
-            if(TextUtils.equals(apnContext.getApnType(),Phone.APN_TYPE_DEFAULT)) {
+            if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) {
                 SystemProperties.set("gsm.defaultpdpcontext.active", "true");
-                if (canSetPreferApn && mPreferredApn == null) {
-                    log("PREFERED APN is null");
-                    mPreferredApn = apnContext.getApnSetting();
-                    if (mPreferredApn != null) {
-                        setPreferredApn(mPreferredApn.id);
-                    }
-                }
+                        if (canSetPreferApn && mPreferredApn == null) {
+                            log("PREFERRED APN is null");
+                            mPreferredApn = mActiveApn;
+                            setPreferredApn(mPreferredApn.id);
+                        }
             } else {
                 SystemProperties.set("gsm.defaultpdpcontext.active", "false");
             }
-            notifyDefaultData(apnContext);
+            notifyDefaultData(reason);
 
             // TODO: For simultaneous PDP support, we need to build another
             // trigger another TRY_SETUP_DATA for the next APN type.  (Note
             // that the existing connection may service that type, in which
             // case we should try the next type, etc.
-            // I dont believe for simultaneous PDP you need to trigger. Each
-            // Connection should be independent and they can be setup simultaneously
-            // So, dont have to wait till one is finished.
         } else {
             GsmDataConnection.FailCause cause;
             cause = (GsmDataConnection.FailCause) (ar.result);
             if (DBG) {
                 String apnString;
                 try {
-                    apnString = apnContext.getWaitingApns().get(0).apn;
+                    apnString = mWaitingApns.get(0).apn;
                 } catch (Exception e) {
                     apnString = "<unknown>";
                 }
@@ -1478,31 +988,28 @@
             }
 
             // Count permanent failures and remove the APN we just tried
-            // TODO: Where is mWaitingApnsPermanentFailureCountDown initialized
-            if (cause.isPermanentFail())
-                apnContext.decPermFailCount();
-
-            apnContext.removeNextApn();
+            mWaitingApnsPermanentFailureCountDown -= cause.isPermanentFail() ? 1 : 0;
+            mWaitingApns.remove(0);
             if (DBG) log(String.format("onDataSetupComplete: mWaitingApns.size=%d" +
                             " mWaitingApnsPermanenatFailureCountDown=%d",
-                            apnContext.getWaitingApns().size(), apnContext.getPermFailCount()));
+                            mWaitingApns.size(), mWaitingApnsPermanentFailureCountDown));
 
             // See if there are more APN's to try
-            if (apnContext.getWaitingApns().isEmpty()) {
-                if (apnContext.getPermFailCount() == 0) {
+            if (mWaitingApns.isEmpty()) {
+                if (mWaitingApnsPermanentFailureCountDown == 0) {
                     if (DBG) log("onDataSetupComplete: Permanent failures stop retrying");
-                    apnContext.setState(State.FAILED);
+                    notifyNoData(cause);
                     notifyDataConnection(Phone.REASON_APN_FAILED);
                 } else {
                     if (DBG) log("onDataSetupComplete: Not all permanent failures, retry");
-                    startDelayedRetry(cause, apnContext);
+                    startDelayedRetry(cause, reason);
                 }
             } else {
                 if (DBG) log("onDataSetupComplete: Try next APN");
-                apnContext.setState(State.SCANNING);
+                setState(State.SCANNING);
                 // Wait a bit before trying the next APN, so that
                 // we're not tying up the RIL command channel
-                sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext), APN_DELAY_MILLIS);
+                sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, reason), APN_DELAY_MILLIS);
             }
         }
     }
@@ -1512,31 +1019,16 @@
      */
     @Override
     protected void onDisconnectDone(int connId, AsyncResult ar) {
-        ApnContext apnContext = null;
-
         if(DBG) log("EVENT_DISCONNECT_DONE connId=" + connId);
-        if (ar.userObj instanceof ApnContext) {
-            apnContext = (ApnContext) ar.userObj;
+        String reason = null;
+        if (ar.userObj instanceof String) {
+           reason = (String) ar.userObj;
         }
-
-        mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
-        // Check if APN disabled.
-        if (apnContext.getPendingAction() == ApnContext.PENDING_ACTION_APN_DISABLE) {
-           mApnContexts.remove(apnContext.getApnType());
-           return;
-        }
-
-        apnContext.setState(State.IDLE);
-        apnContext.setApnSetting(null);
-        if (TextUtils.equals(apnContext.getApnType(), Phone.APN_TYPE_DEFAULT)
-            && retryAfterDisconnected(apnContext.getReason())) {
-            SystemProperties.set("gsm.defaultpdpcontext.active", "false");
-            trySetupData(apnContext);
-        }
-        else if (apnContext.getPendingAction() == ApnContext.PENDING_ACTION_RECONNECT)
-        {
-            apnContext.setPendingAction(ApnContext.PENDING_ACTION_NONE);
-            trySetupData(apnContext);
+        setState(State.IDLE);
+        notifyDataConnection(reason);
+        mActiveApn = null;
+        if (retryAfterDisconnected(reason)) {
+            trySetupData(reason);
         }
     }
 
@@ -1554,7 +1046,7 @@
     }
 
     protected void onPollPdp() {
-        if (getOverallState() == State.CONNECTED) {
+        if (mState == State.CONNECTED) {
             // only poll when connected
             mPhone.mCM.getPDPContextList(this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE));
             sendMessageDelayed(obtainMessage(EVENT_POLL_PDP), POLL_PDP_MILLIS);
@@ -1563,7 +1055,7 @@
 
     @Override
     protected void onVoiceCallStarted() {
-        if (isConnected() && ! mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
+        if (mState == State.CONNECTED && ! mGsmPhone.mSST.isConcurrentVoiceAndData()) {
             stopNetStatPoll();
             notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
         }
@@ -1571,8 +1063,8 @@
 
     @Override
     protected void onVoiceCallEnded() {
-        if (isConnected()) {
-            if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
+        if (mState == State.CONNECTED) {
+            if (!mGsmPhone.mSST.isConcurrentVoiceAndData()) {
                 startNetStatPoll();
                 notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
             } else {
@@ -1584,39 +1076,13 @@
             mRetryMgr.resetRetryCount();
             mReregisterOnReconnectFailure = false;
             // in case data setup was attempted when we were on a voice call
-            trySetupData(Phone.REASON_VOICE_CALL_ENDED, Phone.APN_TYPE_DEFAULT);
+            trySetupData(Phone.REASON_VOICE_CALL_ENDED);
         }
     }
 
     @Override
-    protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) {
-        if (DBG) log("onCleanUpConnection");
-        ApnContext apnContext = mApnContexts.get(apnIdToType(apnId));
-        cleanUpConnection(tearDown, apnContext);
-    }
-
-    protected boolean isConnected() {
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-         while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-            if (apnContext.getState() == State.CONNECTED) {
-            return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    protected void notifyDataConnection(String reason) {
-        if (DBG) log("notify all enabled connection for:" + reason);
-        Iterator<ApnContext> it = mApnContexts.values().iterator();
-        while (it.hasNext()) {
-            ApnContext apnContext = it.next();
-            if (DBG) log("notify for type:"+apnContext.getApnType());
-            mPhone.notifyDataConnection(reason != null ? reason : apnContext.getReason(),
-                    apnContext.getApnType());
-        }
-        notifyDataAvailability(reason);
+    protected void onCleanUpConnection(boolean tearDown, String reason) {
+        cleanUpConnection(tearDown, reason);
     }
 
     /**
@@ -1625,7 +1091,7 @@
      */
     private void createAllApnList() {
         mAllApns = new ArrayList<ApnSetting>();
-        String operator = mPhone.mSIMRecords.getSIMOperatorNumeric();
+        String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric();
 
         if (operator != null) {
             String selection = "numeric = '" + operator + "'";
@@ -1644,8 +1110,7 @@
         if (mAllApns.isEmpty()) {
             if (DBG) log("No APN found for carrier: " + operator);
             mPreferredApn = null;
-            // TODO: What is the right behaviour?
-            //notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
+            notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
         } else {
             mPreferredApn = getPreferredApn();
             log("Get PreferredAPN");
@@ -1682,7 +1147,7 @@
         }
 
         int id = mUniqueIdGenerator.getAndIncrement();
-        DataConnection conn = GsmDataConnection.makeDataConnection(mPhone, id, rm);
+        DataConnection conn = GsmDataConnection.makeDataConnection(mGsmPhone, id, rm);
         mDataConnections.put(id, conn);
         mApnToDataConnectionId.put(apnType, id);
 
@@ -1726,7 +1191,7 @@
             return apnList;
         }
 
-        String operator = mPhone.mSIMRecords.getSIMOperatorNumeric();
+        String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric();
 
         if (requestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
             if (canSetPreferApn && mPreferredApn != null) {
@@ -1753,6 +1218,22 @@
         return apnList;
     }
 
+    /**
+     * Get next apn in waitingApns
+     * @return the first apn found in waitingApns, null if none
+     */
+    private ApnSetting getNextApn() {
+        ArrayList<ApnSetting> list = mWaitingApns;
+        ApnSetting apn = null;
+
+        if (list != null) {
+            if (!list.isEmpty()) {
+                apn = list.get(0);
+            }
+        }
+        return apn;
+    }
+
     private String apnListToString (ArrayList<ApnSetting> apns) {
         StringBuilder result = new StringBuilder();
         for (int i = 0, size = apns.size(); i < size; i++) {
@@ -1763,9 +1244,9 @@
         return result.toString();
     }
 
-    private void startDelayedRetry(GsmDataConnection.FailCause cause, ApnContext apnContext) {
-        notifyNoData(cause, apnContext);
-        reconnectAfterFail(cause, apnContext);
+    private void startDelayedRetry(GsmDataConnection.FailCause cause, String reason) {
+        notifyNoData(cause);
+        reconnectAfterFail(cause, reason);
     }
 
     private void setPreferredApn(int pos) {
@@ -1821,7 +1302,7 @@
     public void handleMessage (Message msg) {
         if (DBG) log("GSMDataConnTrack handleMessage "+msg);
 
-        if (!mPhone.mIsTheCurrentActivePhone) {
+        if (!mGsmPhone.mIsTheCurrentActivePhone) {
             log("Ignore GSM msgs since GSM phone is inactive");
             return;
         }
@@ -1831,20 +1312,12 @@
                 onRecordsLoaded();
                 break;
 
-        case EVENT_ENABLE_NEW_APN:
-                ApnContext apnContext = null;
-                if (msg.obj instanceof ApnContext) {
-                    apnContext = (ApnContext)msg.obj;
-                }
-                onEnableNewApn(apnContext);
+            case EVENT_GPRS_DETACHED:
+                onGprsDetached();
                 break;
 
-            case EVENT_DATA_CONNECTION_DETACHED:
-                onDataConnectionDetached();
-                break;
-
-            case EVENT_DATA_CONNECTION_ATTACHED:
-                onDataConnectionAttached();
+            case EVENT_GPRS_ATTACHED:
+                onGprsAttached();
                 break;
 
             case EVENT_DATA_STATE_CHANGED:
@@ -1890,37 +1363,18 @@
                  */
                 log("[DSAC DEB] " + "EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted);
                 mIsPsRestricted  = false;
-                if (isConnected()) {
+                if (mState == State.CONNECTED) {
                     startNetStatPoll();
                 } else {
-                    // TODO: Should all PDN states be checked to fail?
                     if (mState == State.FAILED) {
-                        cleanUpAllConnections(false, Phone.REASON_PS_RESTRICT_ENABLED);
+                        cleanUpConnection(false, Phone.REASON_PS_RESTRICT_ENABLED);
                         mRetryMgr.resetRetryCount();
                         mReregisterOnReconnectFailure = false;
                     }
-                    trySetupData(Phone.REASON_PS_RESTRICT_ENABLED, Phone.APN_TYPE_DEFAULT);
-                }
-                break;
-            case EVENT_TRY_SETUP_DATA:
-                if (msg.obj instanceof ApnContext) {
-                    onTrySetupData((ApnContext)msg.obj);
-                } else {
-                    if (msg.obj instanceof String) {
-                        onTrySetupData((String)msg.obj);
-                    }
+                    trySetupData(Phone.REASON_PS_RESTRICT_ENABLED);
                 }
                 break;
 
-            case EVENT_CLEAN_UP_CONNECTION:
-                boolean tearDown = (msg.arg1 == 0) ? false : true;
-                if (msg.obj instanceof ApnContext) {
-                    cleanUpConnection(tearDown, (ApnContext)msg.obj);
-                } else {
-                    Log.e(LOG_TAG,
-                          "[GsmDataConnectionTracker] connectpion cleanup request w/o apn context");
-                }
-                break;
             default:
                 // handle the message in the super class DataConnectionTracker
                 super.handleMessage(msg);
@@ -1928,18 +1382,6 @@
         }
     }
 
-    protected int getApnProfileID(String apnType) {
-        if (TextUtils.equals(apnType, Phone.APN_TYPE_IMS)) {
-            return RILConstants.DATA_PROFILE_IMS;
-        } else if (TextUtils.equals(apnType, Phone.APN_TYPE_FOTA)) {
-            return RILConstants.DATA_PROFILE_FOTA;
-        } else if (TextUtils.equals(apnType, Phone.APN_TYPE_CBS)) {
-            return RILConstants.DATA_PROFILE_CBS;
-        } else {
-            return RILConstants.DATA_PROFILE_DEFAULT;
-        }
-    }
-
     @Override
     protected void log(String s) {
         Log.d(LOG_TAG, "[GsmDataConnectionTracker] " + s);
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
index 21a12f1..f576b4e 100755
--- a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
@@ -99,7 +99,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public int dispatchMessage(SmsMessageBase smsb) {
+    protected int dispatchMessage(SmsMessageBase smsb) {
 
         // If sms is null, means there was a parsing error.
         if (smsb == null) {
@@ -383,7 +383,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void activateCellBroadcastSms(int activate, Message response) {
+    protected void activateCellBroadcastSms(int activate, Message response) {
         // Unless CBS is implemented for GSM, this point should be unreachable.
         Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
         response.recycle();
@@ -391,7 +391,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void getCellBroadcastSmsConfig(Message response){
+    protected void getCellBroadcastSmsConfig(Message response){
         // Unless CBS is implemented for GSM, this point should be unreachable.
         Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
         response.recycle();
@@ -399,7 +399,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public  void setCellBroadcastConfig(int[] configValuesArray, Message response) {
+    protected  void setCellBroadcastConfig(int[] configValuesArray, Message response) {
         // Unless CBS is implemented for GSM, this point should be unreachable.
         Log.e(TAG, "Error! The functionality cell broadcast sms is not implemented for GSM.");
         response.recycle();
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 416184d..ac83808 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -278,8 +278,7 @@
      * @param what what code of message when delivered
      * @param obj placed in Message.obj
      */
-    @Override
-    public void registerForDataConnectionAttached(Handler h, int what, Object obj) {
+    void registerForGprsAttached(Handler h, int what, Object obj) {
         Registrant r = new Registrant(h, what, obj);
         gprsAttachedRegistrants.add(r);
 
@@ -288,8 +287,7 @@
         }
     }
 
-    @Override
-    public void unregisterForDataConnectionAttached(Handler h) {
+    void unregisterForGprsAttached(Handler h) {
         gprsAttachedRegistrants.remove(h);
     }
 
@@ -331,7 +329,7 @@
      * @param what what code of message when delivered
      * @param obj placed in Message.obj
      */
-    public void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
+    void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
         Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedEnabled ");
         Registrant r = new Registrant(h, what, obj);
         psRestrictEnabledRegistrants.add(r);
@@ -341,7 +339,7 @@
         }
     }
 
-    public void unregisterForPsRestrictedEnabled(Handler h) {
+    void unregisterForPsRestrictedEnabled(Handler h) {
         psRestrictEnabledRegistrants.remove(h);
     }
 
@@ -351,7 +349,7 @@
      * @param what what code of message when delivered
      * @param obj placed in Message.obj
      */
-    public void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
+    void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
         Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedDisabled ");
         Registrant r = new Registrant(h, what, obj);
         psRestrictDisabledRegistrants.add(r);
@@ -361,7 +359,7 @@
         }
     }
 
-    public void unregisterForPsRestrictedDisabled(Handler h) {
+    void unregisterForPsRestrictedDisabled(Handler h) {
         psRestrictDisabledRegistrants.remove(h);
     }
 
@@ -569,21 +567,33 @@
             && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
             cm.setRadioPower(true, null);
         } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
+            DataConnectionTracker dcTracker = phone.mDataConnection;
+            if (! dcTracker.isDataConnectionAsDesired()) {
+                EventLog.writeEvent(EventLogTags.DATA_NETWORK_STATUS_ON_RADIO_OFF,
+                        dcTracker.getStateInString(), dcTracker.getAnyDataEnabled() ? 1 : 0);
+            }
             // If it's on and available and we want it off gracefully
             powerOffRadioSafely();
         } // Otherwise, we're in the desired state
     }
 
     @Override
-    public void powerOffRadioSafely() {
-        // Cleanup all connections
+    protected void powerOffRadioSafely() {
+        // clean data connection
         DataConnectionTracker dcTracker = phone.mDataConnection;
-        Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_ALL_CONNECTIONS);
+        Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
+        msg.arg1 = 1; // tearDown is true
+        msg.obj = GSMPhone.REASON_RADIO_TURNED_OFF;
         dcTracker.sendMessage(msg);
 
         // poll data state up to 15 times, with a 100ms delay
         // totaling 1.5 sec. Normal data disable action will finish in 100ms.
         for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
+            if (dcTracker.getState() != DataConnectionTracker.State.CONNECTED
+                    && dcTracker.getState() != DataConnectionTracker.State.DISCONNECTING) {
+                Log.d(LOG_TAG, "Data shutdown complete.");
+                break;
+            }
             SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
         }
 
@@ -1063,7 +1073,7 @@
         }
 
         if (hasNetworkTypeChanged) {
-            phone.notifyDataConnection(Phone.REASON_NW_TYPE_CHANGED, Phone.APN_TYPE_ALL);
+            phone.notifyDataConnection();
         }
 
         if (hasRoamingOn) {
@@ -1391,15 +1401,11 @@
         return gprsState;
     }
 
-    public int getCurrentDataConnectionState() {
-        return gprsState;
-    }
-
     /**
      * @return true if phone is camping on a technology (eg UMTS)
      * that could support voice and data simultaneously.
      */
-    public boolean isConcurrentVoiceAndDataAllowed() {
+    boolean isConcurrentVoiceAndData() {
         return (networkType >= DATA_ACCESS_UMTS);
     }
 
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
index 11ce83e..3b133da 100755
--- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
@@ -35,7 +35,6 @@
 import com.android.internal.telephony.IccVmFixedException;
 import com.android.internal.telephony.IccVmNotSupportedException;
 import com.android.internal.telephony.MccTable;
-import com.android.internal.telephony.PhoneBase;
 
 import java.util.ArrayList;
 
@@ -166,7 +165,7 @@
 
     // ***** Constructor
 
-    public SIMRecords(PhoneBase p) {
+    SIMRecords(GSMPhone p) {
         super(p);
 
         adnCache = new AdnRecordCache(phone);
@@ -365,7 +364,7 @@
 
         countVoiceMessages = countWaiting;
 
-        phone.notifyMessageWaitingIndicator();
+        ((GSMPhone) phone).notifyMessageWaitingIndicator();
 
         try {
             if (efMWIS != null) {
@@ -414,7 +413,7 @@
 
         callForwardingEnabled = enable;
 
-        phone.notifyCallForwardingIndicator();
+        ((GSMPhone) phone).notifyCallForwardingIndicator();
 
         try {
             if (mEfCfis != null) {
@@ -471,7 +470,7 @@
     /** Returns the 5 or 6 digit MCC/MNC of the operator that
      *  provided the SIM card. Returns null of SIM is not yet ready
      */
-    public String getSIMOperatorNumeric() {
+    String getSIMOperatorNumeric() {
         if (imsi == null || mncLength == UNINITIALIZED || mncLength == UNKNOWN) {
             return null;
         }
@@ -548,7 +547,7 @@
                     // finally have both the imsi and the mncLength and can parse the imsi properly
                     MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
                 }
-                phone.mSimCard.broadcastIccStateChangedIntent(
+                ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
                         SimCard.INTENT_VALUE_ICC_IMSI, null);
             break;
 
@@ -703,7 +702,7 @@
                     countVoiceMessages = -1;
                 }
 
-                phone.notifyMessageWaitingIndicator();
+                ((GSMPhone) phone).notifyMessageWaitingIndicator();
             break;
 
             case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE:
@@ -732,7 +731,7 @@
                         countVoiceMessages = 0;
                     }
 
-                    phone.notifyMessageWaitingIndicator();
+                    ((GSMPhone) phone).notifyMessageWaitingIndicator();
                 }
             break;
 
@@ -843,7 +842,7 @@
                     callForwardingEnabled =
                         ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE);
 
-                    phone.notifyCallForwardingIndicator();
+                    ((GSMPhone) phone).notifyCallForwardingIndicator();
                 }
                 break;
 
@@ -1043,7 +1042,7 @@
                 // Refer TS 51.011 Section 10.3.46 for the content description
                 callForwardingEnabled = ((data[1] & 0x01) != 0);
 
-                phone.notifyCallForwardingIndicator();
+                ((GSMPhone) phone).notifyCallForwardingIndicator();
                 break;
 
             case EVENT_GET_CSP_CPHS_DONE:
@@ -1153,7 +1152,7 @@
             System.arraycopy(ba, 1, pdu, 0, n - 1);
             SmsMessage message = SmsMessage.createFromPdu(pdu);
 
-            phone.mSMS.dispatchMessage(message);
+            ((GSMPhone) phone).mSMS.dispatchMessage(message);
         }
     }
 
@@ -1179,7 +1178,7 @@
                 System.arraycopy(ba, 1, pdu, 0, n - 1);
                 SmsMessage message = SmsMessage.createFromPdu(pdu);
 
-                phone.mSMS.dispatchMessage(message);
+                ((GSMPhone) phone).mSMS.dispatchMessage(message);
 
                 // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
                 // 1 == "received by MS from network; message read"
@@ -1229,7 +1228,7 @@
 
         recordsLoadedRegistrants.notifyRegistrants(
             new AsyncResult(null, null, null));
-        phone.mSimCard.broadcastIccStateChangedIntent(
+        ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
                 SimCard.INTENT_VALUE_ICC_LOADED, null);
     }
 
@@ -1250,11 +1249,11 @@
         }
     }
 
-    public void onSimReady() {
+    private void onSimReady() {
         /* broadcast intent SIM_READY here so that we can make sure
           READY is sent before IMSI ready
         */
-        phone.mSimCard.broadcastIccStateChangedIntent(
+        ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
                 SimCard.INTENT_VALUE_ICC_READY, null);
 
         fetchSimRecords();
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimCard.java b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
index 5a2f871..835cb29 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimCard.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
@@ -19,8 +19,6 @@
 import android.util.Log;
 
 import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.PhoneBase;
-import android.os.SystemProperties;
 
 /**
  * {@hide}
@@ -36,21 +34,6 @@
         updateStateProperty();
     }
 
-    /**
-    * We have the Sim card for LTE on CDMA phone
-    */
-    public SimCard(PhoneBase phone, String logTag, Boolean dbg) {
-        super(phone, logTag, dbg);
-        mPhone.mCM.registerForSIMLockedOrAbsent(mHandler, EVENT_ICC_LOCKED_OR_ABSENT, null);
-        mPhone.mCM.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
-        mPhone.mCM.registerForSIMReady(mHandler, EVENT_ICC_READY, null);
-        updateStateProperty();
-
-        if(SystemProperties.getBoolean("ro.mot.lte_on_cdma", false)) {
-            mPhone.mCM.registerForNVReady(mHandler, EVENT_ICC_READY, null);
-        }
-    }
-
     @Override
     public void dispose() {
         //Unregister for all events
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
index a1078c1..1032074 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
@@ -58,21 +58,21 @@
         testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN";
         expected_apn =  new ApnSetting(
                 -1, "22210", "Vodafone IT", "web.omnitel.it", "", "",
-                "", "", "", "", "", 0, dunTypes, "IP", "IP", true, 0, 0);
+                "", "", "", "", "", 0, dunTypes, "IP", "IP");
         assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
 
         // A v2 string.
         testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP";
         expected_apn =  new ApnSetting(
                 -1, "12345", "Name", "apn", "", "",
-                "", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0);
+                "", "", "", "", "", 0, mmsTypes, "IPV6", "IP");
         assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
 
         // A v2 string with spaces.
         testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP";
         expected_apn =  new ApnSetting(
                 -1, "12345", "Name", "apn", "", "",
-                "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP", true, 0, 0);
+                "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP");
         assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
 
         // Return null if insufficient fields given.
@@ -87,7 +87,7 @@
         String[] incorrectTypes = {"mms|*", "IPV6"};
         expected_apn =  new ApnSetting(
                 -1, "12345", "Name", "apn", "", "",
-                "", "", "", "", "", 0, incorrectTypes, "IP", "IP", true, 0, 0);
+                "", "", "", "", "", 0, incorrectTypes, "IP", "IP");
         assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
     }
 
@@ -98,7 +98,7 @@
         ApnSetting apn =  new ApnSetting(
                 99, "12345", "Name", "apn", "proxy", "port",
                 "mmsc", "mmsproxy", "mmsport", "user", "password", 0,
-                types, "IPV4V6", "IP", true, 0, 0);
+                types, "IPV4V6", "IP");
         String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " +
                 "mmsc, mmsproxy, mmsport, port, 0, default | *, " +
                 "IPV4V6, IP";