diff --git a/telephony/java/com/android/internal/telephony/IccRecords.java b/telephony/java/com/android/internal/telephony/IccRecords.java
index ea24c25..b8d9e3c 100644
--- a/telephony/java/com/android/internal/telephony/IccRecords.java
+++ b/telephony/java/com/android/internal/telephony/IccRecords.java
@@ -31,7 +31,7 @@
 public abstract class IccRecords extends Handler implements IccConstants {
 
     protected static final boolean DBG = true;
-    //***** Instance Variables
+    // ***** Instance Variables
 
     protected PhoneBase phone;
     protected RegistrantList recordsLoadedRegistrants = new RegistrantList();
@@ -40,7 +40,7 @@
 
     protected AdnRecordCache adnCache;
 
-    //***** Cached SIM State; cleared on channel close
+    // ***** Cached SIM State; cleared on channel close
 
     protected boolean recordsRequested = false; // true if we've made requests for the sim records
 
@@ -54,23 +54,26 @@
     protected boolean isVoiceMailFixed = false;
     protected int countVoiceMessages = 0;
 
-    protected int mncLength = 0;   // 0 is used to indicate that the value
-                         // is not initialized
+    protected int mncLength = UNINITIALIZED;
     protected int mailboxIndex = 0; // 0 is no mailbox dailing number associated
 
     protected String spn;
     protected int spnDisplayCondition;
 
-    //***** Constants
+    // ***** Constants
+
+    // Markers for mncLength
+    protected static final int UNINITIALIZED = -1;
+    protected static final int UNKNOWN = 0;
 
     // Bitmasks for SPN display rules.
     protected static final int SPN_RULE_SHOW_SPN  = 0x01;
     protected static final int SPN_RULE_SHOW_PLMN = 0x02;
 
-    //***** Event Constants
+    // ***** Event Constants
     protected static final int EVENT_SET_MSISDN_DONE = 30;
 
-    //***** Constructor
+    // ***** Constructor
 
     public IccRecords(PhoneBase p) {
         this.phone = p;
@@ -234,4 +237,3 @@
 
     protected abstract void log(String s);
 }
-
diff --git a/telephony/java/com/android/internal/telephony/gsm/MccTable.java b/telephony/java/com/android/internal/telephony/MccTable.java
similarity index 84%
rename from telephony/java/com/android/internal/telephony/gsm/MccTable.java
rename to telephony/java/com/android/internal/telephony/MccTable.java
index 9343f44..0d11f8c 100644
--- a/telephony/java/com/android/internal/telephony/gsm/MccTable.java
+++ b/telephony/java/com/android/internal/telephony/MccTable.java
@@ -14,7 +14,17 @@
  * limitations under the License.
  */
 
-package com.android.internal.telephony.gsm;
+package com.android.internal.telephony;
+
+import android.app.ActivityManagerNative;
+import android.app.AlarmManager;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.net.wifi.WifiManager;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.util.Log;
 
 import java.util.Arrays;
 
@@ -475,8 +485,10 @@
         0x65630400, 0x67660400, 0x70790400, 0x73720400, 0x75790400, 0x666b0400
     };
 
+    static final String LOG_TAG = "MccTable";
+
     /**
-     * Given a GSM Mobile Country Code, returns a default time zone ID
+     * Given a Mobile Country Code, returns a default time zone ID
      * if available.  Returns null if unavailable.
      */
     public static String defaultTimeZoneForMcc(int mcc) {
@@ -494,7 +506,7 @@
     }
 
     /**
-     * Given a GSM Mobile Country Code, returns an ISO two-character
+     * Given a Mobile Country Code, returns an ISO two-character
      * country code if available.  Returns "" if unavailable.
      */
     public static String countryCodeForMcc(int mcc) {
@@ -553,4 +565,95 @@
         return wifi;
     }
 
+    /**
+     * Updates MCC and MNC device configuration information for application retrieving
+     * correct version of resources.  If either MCC or MNC is 0, they will be ignored (not set).
+     * @param phone PhoneBae to act on.
+     * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end
+     */
+    public static void updateMccMncConfiguration(PhoneBase phone, String mccmnc) {
+        Configuration config = new Configuration();
+        int mcc, mnc;
+
+        try {
+            mcc = Integer.parseInt(mccmnc.substring(0,3));
+            mnc = Integer.parseInt(mccmnc.substring(3));
+        } catch (NumberFormatException e) {
+            Log.e(LOG_TAG, "Error parsing IMSI");
+            return;
+        }
+
+        Log.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc);
+
+        if (mcc != 0) {
+            config.mcc = mcc;
+            setTimezoneFromMccIfNeeded(phone, mcc);
+            setLocaleFromMccIfNeeded(phone, mcc);
+            setWifiChannelsFromMccIfNeeded(phone, mcc);
+        }
+        if (mnc != 0) {
+            config.mnc = mnc;
+        }
+        try {
+            ActivityManagerNative.getDefault().updateConfiguration(config);
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "Can't update configuration", e);
+        }
+    }
+
+    /**
+     * If the timezone is not already set, set it based on the MCC of the SIM.
+     * @param phone PhoneBase to act on (get context from).
+     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+     */
+    private static void setTimezoneFromMccIfNeeded(PhoneBase phone, int mcc) {
+        String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY);
+        if (timezone == null || timezone.length() == 0) {
+            String zoneId = defaultTimeZoneForMcc(mcc);
+            if (zoneId != null && zoneId.length() > 0) {
+                Context context = phone.getContext();
+                // Set time zone based on MCC
+                AlarmManager alarm =
+                        (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+                alarm.setTimeZone(zoneId);
+                Log.d(LOG_TAG, "timezone set to "+zoneId);
+            }
+        }
+    }
+
+    /**
+     * If the locale is not already set, set it based on the MCC of the SIM.
+     * @param phone PhoneBase to act on.
+     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+     */
+    private static void setLocaleFromMccIfNeeded(PhoneBase phone, int mcc) {
+        String language = MccTable.defaultLanguageForMcc(mcc);
+        String country = MccTable.countryCodeForMcc(mcc);
+
+        Log.d(LOG_TAG, "locale set to "+language+"_"+country);
+        phone.setSystemLocale(language, country);
+    }
+
+    /**
+     * If the number of allowed wifi channels has not been set, set it based on
+     * the MCC of the SIM.
+     * @param phone PhoneBase to act on (get context from).
+     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+     */
+    private static void setWifiChannelsFromMccIfNeeded(PhoneBase phone, int mcc) {
+        int wifiChannels = MccTable.wifiChannelsForMcc(mcc);
+        if (wifiChannels != 0) {
+            Context context = phone.getContext();
+            // only set to this default if the user hasn't manually set it
+            try {
+                Settings.Secure.getInt(context.getContentResolver(),
+                        Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS);
+            } catch (Settings.SettingNotFoundException e) {
+                Log.d(LOG_TAG, "WIFI_NUM_ALLOWED_CHANNESL set to " + wifiChannels);
+                WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+                // don't persist
+                wM.setNumAllowedChannels(wifiChannels, false);
+            }
+        }
+    }
 }
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index 647b991..ff06bc0 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -48,10 +48,7 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.DataConnection;
-// TODO(Moto): need to move MccTable from telephony.gsm to telephony
-// since there is no difference between CDMA and GSM for MccTable and
-// CDMA uses gsm's MccTable is not good.
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
 import com.android.internal.telephony.IccCard;
 import com.android.internal.telephony.IccException;
 import com.android.internal.telephony.IccFileHandler;
@@ -203,7 +200,7 @@
         updateCurrentCarrierInProvider(operatorNumeric);
 
         // Updates MCC MNC device configuration information
-        updateMccMncConfiguration(operatorNumeric);
+        MccTable.updateMccMncConfiguration(this, operatorNumeric);
 
 
         // Notify voicemails.
@@ -1406,21 +1403,4 @@
         return false;
     }
 
-    /**
-     * Updates MCC and MNC device configuration information for application retrieving
-     * correct version of resources
-     *
-     */
-    private void updateMccMncConfiguration(String operatorNumeric) {
-        if (operatorNumeric.length() >= 5) {
-            Configuration config = new Configuration();
-            config.mcc = Integer.parseInt(operatorNumeric.substring(0,3));
-            config.mnc = Integer.parseInt(operatorNumeric.substring(3));
-            try {
-                ActivityManagerNative.getDefault().updateConfiguration(config);
-            } catch (RemoteException e) {
-                Log.e(LOG_TAG, "Can't update configuration", e);
-            }
-        }
-    }
 }
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index dab529e..46e360b 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -45,9 +45,8 @@
 import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.DataConnectionTracker;
-import com.android.internal.telephony.gsm.MccTable;
 import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.PhoneProxy;
+import com.android.internal.telephony.MccTable;
 import com.android.internal.telephony.ServiceStateTracker;
 import com.android.internal.telephony.TelephonyEventLog;
 import com.android.internal.telephony.TelephonyIntents;
diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
index 7c74314..b9ece8b 100644
--- a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
+++ b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
@@ -28,7 +28,7 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.TelephonyProperties;
 import com.android.internal.telephony.cdma.RuimCard;
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
 
 // can't be used since VoiceMailConstants is not public
 //import com.android.internal.telephony.gsm.VoiceMailConstants;
@@ -47,7 +47,7 @@
     private static final boolean DBG = true;
     private boolean  m_ota_commited=false;
 
-    //***** Instance Variables
+    // ***** Instance Variables
 
     private String mImsi;
     private String mMyMobileNumber;
@@ -55,7 +55,7 @@
 
     private String mPrlVersion;
 
-    //***** Event Constants
+    // ***** Event Constants
 
     private static final int EVENT_RUIM_READY = 1;
     private static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 2;
@@ -109,7 +109,7 @@
     @Override
     protected void onRadioOffOrNotAvailable() {
         countVoiceMessages = 0;
-        mncLength = 0;
+        mncLength = UNINITIALIZED;
         iccid = null;
 
         adnCache.reset();
@@ -167,7 +167,7 @@
         }
 
         // TODO(Moto): mncLength is not set anywhere.
-        if (mncLength != 0) {
+        if (mncLength != UNINITIALIZED && mncLength != UNKNOWN) {
             // Length = length of MCC + length of MNC
             // TODO: change spec name
             // length of mcc = 3 (3GPP2 C.S0005 - Section 2.3)
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index a9be068..65463e5 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -49,6 +49,7 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.DataConnectionTracker;
 import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.MccTable;
 import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.ServiceStateTracker;
 import com.android.internal.telephony.TelephonyEventLog;
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
index 4272faa..7f7855a 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
@@ -19,13 +19,10 @@
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
-import android.app.AlarmManager;
 import android.content.Context;
-import android.net.wifi.WifiManager;
 import android.os.AsyncResult;
 import android.os.Message;
 import android.os.SystemProperties;
-import android.provider.Settings;
 import android.util.Log;
 
 import com.android.internal.telephony.AdnRecord;
@@ -37,6 +34,7 @@
 import com.android.internal.telephony.IccUtils;
 import com.android.internal.telephony.IccVmFixedException;
 import com.android.internal.telephony.IccVmNotSupportedException;
+import com.android.internal.telephony.MccTable;
 
 import java.util.ArrayList;
 
@@ -51,14 +49,14 @@
 
     private static final boolean DBG = true;
 
-    //***** Instance Variables
+    // ***** Instance Variables
 
     VoiceMailConstants mVmConfig;
 
 
     SpnOverride mSpnOverride;
 
-    //***** Cached SIM State; cleared on channel close
+    // ***** Cached SIM State; cleared on channel close
 
     String imsi;
     boolean callForwardingEnabled;
@@ -88,7 +86,7 @@
 
     String pnnHomeName = null;
 
-    //***** Constants
+    // ***** Constants
 
     // Bitmasks for SPN display rules.
     static final int SPN_RULE_SHOW_SPN  = 0x01;
@@ -113,7 +111,7 @@
     private static final int CPHS_SST_MBN_MASK = 0x30;
     private static final int CPHS_SST_MBN_ENABLED = 0x30;
 
-    //***** Event Constants
+    // ***** Event Constants
 
     private static final int EVENT_SIM_READY = 1;
     private static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 2;
@@ -143,9 +141,7 @@
     private static final int EVENT_SIM_REFRESH = 31;
     private static final int EVENT_GET_CFIS_DONE = 32;
 
-    private static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
-
-    //***** Constructor
+    // ***** Constructor
 
     SIMRecords(GSMPhone p) {
         super(p);
@@ -188,7 +184,7 @@
         msisdn = null;
         voiceMailNum = null;
         countVoiceMessages = 0;
-        mncLength = 0;
+        mncLength = UNINITIALIZED;
         iccid = null;
         // -1 means no EF_SPN found; treat accordingly.
         spnDisplayCondition = -1;
@@ -453,79 +449,16 @@
      *  provided the SIM card. Returns null of SIM is not yet ready
      */
     String getSIMOperatorNumeric() {
-        if (imsi == null) {
+        if (imsi == null || mncLength == UNINITIALIZED || mncLength == UNKNOWN) {
             return null;
         }
 
-        if (mncLength != 0) {
-            // Length = length of MCC + length of MNC
-            // length of mcc = 3 (TS 23.003 Section 2.2)
-            return imsi.substring(0, 3 + mncLength);
-        }
-
-        // Guess the MNC length based on the MCC if we don't
-        // have a valid value in ef[ad]
-
-        int mcc;
-
-        mcc = Integer.parseInt(imsi.substring(0,3));
-
-        return imsi.substring(0, 3 + MccTable.smallestDigitsMccForMnc(mcc));
+        // Length = length of MCC + length of MNC
+        // length of mcc = 3 (TS 23.003 Section 2.2)
+        return imsi.substring(0, 3 + mncLength);
     }
 
-     /**
-     * If the timezone is not already set, set it based on the MCC of the SIM.
-     * @param mcc Mobile Country Code of the SIM
-     */
-    private void setTimezoneFromMccIfNeeded(int mcc) {
-        String timezone = SystemProperties.get(TIMEZONE_PROPERTY);
-        if (timezone == null || timezone.length() == 0) {
-            String zoneId = MccTable.defaultTimeZoneForMcc(mcc);
-
-            if (zoneId != null && zoneId.length() > 0) {
-                // Set time zone based on MCC
-                AlarmManager alarm =
-                    (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE);
-                alarm.setTimeZone(zoneId);
-            }
-        }
-    }
-
-    /**
-     * If the locale is not already set, set it based on the MCC of the SIM.
-     * @param mcc Mobile Country Code of the SIM
-     */
-    private void setLocaleFromMccIfNeeded(int mcc) {
-        String language = MccTable.defaultLanguageForMcc(mcc);
-        String country = MccTable.countryCodeForMcc(mcc);
-
-        phone.setSystemLocale(language, country);
-    }
-
-    /**
-     * If the number of allowed wifi channels has not been set, set it based on
-     * the MCC of the SIM.
-     * @param mcc Mobile Country Code of the SIM
-     */
-    private void setWifiChannelsFromMccIfNeeded(int mcc) {
-        int wifiChannels = MccTable.wifiChannelsForMcc(mcc);
-
-        if (wifiChannels != 0) {
-            Context context = phone.getContext();
-            // only set to this default if the user hasn't manually set it
-            try {
-                Settings.Secure.getInt(context.getContentResolver(),
-                        Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS);
-            } catch (Settings.SettingNotFoundException e) {
-                WifiManager wM = (WifiManager)
-                        context.getSystemService(Context.WIFI_SERVICE);
-                // don't persist
-                wM.setNumAllowedChannels(wifiChannels, false);
-            }
-        }
-    }
-
-    //***** Overridden from Handler
+    // ***** Overridden from Handler
     public void handleMessage(Message msg) {
         AsyncResult ar;
         AdnRecord adn;
@@ -564,14 +497,25 @@
                 }
 
                 Log.d(LOG_TAG, "IMSI: " + imsi.substring(0, 6) + "xxxxxxxxx");
-                ((GSMPhone) phone).mSimCard.updateImsiConfiguration(imsi);
+
+                if (mncLength == UNKNOWN) {
+                    // the SIM has told us all it knows, but it didn't know the mnc length.
+                    // guess using the mcc
+                    try {
+                        int mcc = Integer.parseInt(imsi.substring(0,3));
+                        mncLength = MccTable.smallestDigitsMccForMnc(mcc);
+                    } catch (NumberFormatException e) {
+                        mncLength = UNKNOWN;
+                        Log.e(LOG_TAG, "SIMRecords: Corrupt IMSI!");
+                    }
+                }
+
+                if (mncLength != UNKNOWN && mncLength != UNINITIALIZED) {
+                    // finally have both the imsi and the mncLength and can parse the imsi properly
+                    MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
+                }
                 ((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
                         SimCard.INTENT_VALUE_ICC_IMSI, null);
-
-                int mcc = Integer.parseInt(imsi.substring(0, 3));
-                setTimezoneFromMccIfNeeded(mcc);
-                setLocaleFromMccIfNeeded(mcc);
-                setWifiChannelsFromMccIfNeeded(mcc);
             break;
 
             case EVENT_GET_MBI_DONE:
@@ -794,12 +738,25 @@
                 mncLength = (int)data[3] & 0xf;
 
                 if (mncLength == 0xf) {
-                    // Resetting mncLength to 0 to indicate that it is not
-                    // initialised
-                    mncLength = 0;
+                    if (imsi != null) {
+                        try {
+                            int mcc = Integer.parseInt(imsi.substring(0,3));
 
-                    Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
-                    break;
+                            mncLength = MccTable.smallestDigitsMccForMnc(mcc);
+                        } catch (NumberFormatException e) {
+                            mncLength = UNKNOWN;
+                            Log.e(LOG_TAG, "SIMRecords: Corrupt IMSI!");
+                        }
+                    } else {
+                        // Indicate we got this info, but it didn't contain the length.
+                        mncLength = UNKNOWN;
+
+                        Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
+                    }
+                }
+                if (imsi != null && mncLength != UNKNOWN) {
+                    // finally have both imsi and the length of the mnc and can parse it properly
+                    MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
                 }
 
             break;
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimCard.java b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
index 6c56682..835cb29 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimCard.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
@@ -16,9 +16,6 @@
 
 package com.android.internal.telephony.gsm;
 
-import android.app.ActivityManagerNative;
-import android.content.res.Configuration;
-import android.os.RemoteException;
 import android.util.Log;
 
 import com.android.internal.telephony.IccCard;
@@ -50,20 +47,4 @@
         return ((GSMPhone)mPhone).mSIMRecords.getServiceProviderName();
     }
 
-    public void updateImsiConfiguration(String imsi) {
-        if (imsi.length() >= 6) {
-            Configuration config = new Configuration();
-            config.mcc = ((imsi.charAt(0)-'0')*100)
-                    + ((imsi.charAt(1)-'0')*10)
-                    + (imsi.charAt(2)-'0');
-            config.mnc = ((imsi.charAt(3)-'0')*100)
-                    + ((imsi.charAt(4)-'0')*10)
-                    + (imsi.charAt(5)-'0');
-            try {
-                ActivityManagerNative.getDefault().updateConfiguration(config);
-            } catch (RemoteException e) {
-                Log.e(mLogTag, "[SimCard] Remote Exception when updating imsi configuration");
-            }
-        }
-    }
 }
diff --git a/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java b/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
index 875376a..b2f1ded 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
@@ -16,7 +16,7 @@
 
 package com.android.unit_tests;
 
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
 
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
