diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index a8d0e8f..b9e729c 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -345,9 +345,7 @@
      * @param context the application context
      * @return the formatted and newline-separated IP addresses, or null if none.
      */
-    public static String getDefaultIpAddresses(Context context) {
-        ConnectivityManager cm = (ConnectivityManager)
-                context.getSystemService(Context.CONNECTIVITY_SERVICE);
+    public static String getDefaultIpAddresses(ConnectivityManager cm) {
         LinkProperties prop = cm.getActiveLinkProperties();
         return formatIpAddresses(prop);
     }
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index b5f7b82..3795c9f 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -129,18 +129,26 @@
 
     private static final int EVENT_UPDATE_STATS = 500;
 
+    private ConnectivityManager mCM;
     private TelephonyManager mTelephonyManager;
+    private WifiManager mWifiManager;
+
     private Phone mPhone = null;
     private PhoneStateIntentReceiver mPhoneStateReceiver;
     private Resources mRes;
-    private Preference mSignalStrength;
-    private Preference mUptime;
     private boolean mShowLatestAreaInfo;
 
-    private String sUnknown;
+    private String mUnknown;
+    private String mUnavailable;
 
+    private Preference mSignalStrength;
+    private Preference mUptime;
     private Preference mBatteryStatus;
     private Preference mBatteryLevel;
+    private Preference mBtAddress;
+    private Preference mIpAddress;
+    private Preference mWifiMacAddress;
+    private Preference mWimaxMacAddress;
 
     private Handler mHandler;
 
@@ -214,20 +222,36 @@
         }
     };
 
+    private boolean hasBluetooth() {
+        return BluetoothAdapter.getDefaultAdapter() != null;
+    }
+
+    private boolean hasWimax() {
+        return  mCM.getNetworkInfo(ConnectivityManager.TYPE_WIMAX) != null;
+    }
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         mHandler = new MyHandler(this);
 
+        mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
         mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
+        mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
 
         addPreferencesFromResource(R.xml.device_info_status);
         mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
         mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
+        mBtAddress = findPreference(KEY_BT_ADDRESS);
+        mWifiMacAddress = findPreference(KEY_WIFI_MAC_ADDRESS);
+        mWimaxMacAddress = findPreference(KEY_WIMAX_MAC_ADDRESS);
+        mIpAddress = findPreference(KEY_IP_ADDRESS);
 
         mRes = getResources();
-        sUnknown = mRes.getString(R.string.device_info_default);
+        mUnknown = mRes.getString(R.string.device_info_default);
+        mUnavailable = mRes.getString(R.string.status_unavailable);
+
         if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
             mPhone = PhoneFactory.getDefaultPhone();
         }
@@ -298,10 +322,17 @@
             }
         }
 
-        setWimaxStatus();
-        setWifiStatus();
-        setBtStatus();
-        setIpAddressStatus();
+        if (!hasBluetooth()) {
+            getPreferenceScreen().removePreference(mBtAddress);
+            mBtAddress = null;
+        }
+
+        if (!hasWimax()) {
+            getPreferenceScreen().removePreference(mWimaxMacAddress);
+            mWimaxMacAddress = null;
+        }
+
+        updateConnectivity();
 
         String serial = Build.SERIAL;
         if (serial != null && !serial.equals("")) {
@@ -399,7 +430,7 @@
 
     private void setSummaryText(String preference, String text) {
             if (TextUtils.isEmpty(text)) {
-               text = sUnknown;
+               text = mUnknown;
              }
              // some preferences may be missing
              if (findPreference(preference) != null) {
@@ -502,55 +533,47 @@
     }
 
     private void setWimaxStatus() {
-        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
-        NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIMAX);
-
-        if (ni == null) {
-            PreferenceScreen root = getPreferenceScreen();
-            Preference ps = (Preference) findPreference(KEY_WIMAX_MAC_ADDRESS);
-            if (ps != null) root.removePreference(ps);
-        } else {
-            Preference wimaxMacAddressPref = findPreference(KEY_WIMAX_MAC_ADDRESS);
-            String macAddress = SystemProperties.get("net.wimax.mac.address",
-                    getString(R.string.status_unavailable));
-            wimaxMacAddressPref.setSummary(macAddress);
+        if (mWimaxMacAddress != null) {
+            String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
+            mWimaxMacAddress.setSummary(macAddress);
         }
     }
+
     private void setWifiStatus() {
-        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
-        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
-
-        Preference wifiMacAddressPref = findPreference(KEY_WIFI_MAC_ADDRESS);
-
+        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
         String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
-        wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
-                : getString(R.string.status_unavailable));
+        mWifiMacAddress.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : mUnavailable);
     }
 
     private void setIpAddressStatus() {
-        Preference ipAddressPref = findPreference(KEY_IP_ADDRESS);
-        String ipAddress = Utils.getDefaultIpAddresses(this);
+        String ipAddress = Utils.getDefaultIpAddresses(this.mCM);
         if (ipAddress != null) {
-            ipAddressPref.setSummary(ipAddress);
+            mIpAddress.setSummary(ipAddress);
         } else {
-            ipAddressPref.setSummary(getString(R.string.status_unavailable));
+            mIpAddress.setSummary(mUnavailable);
         }
     }
 
     private void setBtStatus() {
         BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
-        Preference btAddressPref = findPreference(KEY_BT_ADDRESS);
-
-        if (bluetooth == null) {
-            // device not BT capable
-            getPreferenceScreen().removePreference(btAddressPref);
-        } else {
+        if (bluetooth != null && mBtAddress != null) {
             String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
-            btAddressPref.setSummary(!TextUtils.isEmpty(address) ? address
-                    : getString(R.string.status_unavailable));
+            if (!TextUtils.isEmpty(address)) {
+               // Convert the address to lowercase for consistency with the wifi MAC address.
+                mBtAddress.setSummary(address.toLowerCase());
+            } else {
+                mBtAddress.setSummary(mUnavailable);
+            }
         }
     }
 
+    void updateConnectivity() {
+        setWimaxStatus();
+        setWifiStatus();
+        setBtStatus();
+        setIpAddressStatus();
+    }
+
     void updateTimes() {
         long at = SystemClock.uptimeMillis() / 1000;
         long ut = SystemClock.elapsedRealtime() / 1000;
