diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8f6cc9c..ce0370e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2695,8 +2695,6 @@
     <string name="status_bt_address">Bluetooth address</string>
     <!-- About phone, status item title.  The hardware serial number. [CHAR LIMIT=30]-->
     <string name="status_serial_number">Serial number</string>
-    <!-- About phone, status item value if the actual value is not available. -->
-    <string name="status_unavailable">Unavailable</string>
     <!-- About phone, status item title.  How long the device has been running since its last reboot. -->
     <string name="status_up_time">Up time</string>
     <!-- About phone, status item title.  How much time the device has had its main CPU awake. -->
@@ -5532,8 +5530,6 @@
     <!-- Messaage shown in dialog when you can't manually sync -->
     <string name="cant_sync_dialog_message">Sync for this item is currently disabled. To change this setting, temporarily turn on background data and automatic sync.</string>
 
-    <string name="wimax_settings">4G</string>
-    <string name="status_wimax_mac_address">4G MAC address</string>
     <!-- This is displayed to the user when the device needs to be decrypted -->
     <string name="enter_password">To start Android, enter your password</string>
     <!-- Informational text on the pin entry screen prompting the user for their pin -->
@@ -9071,10 +9067,4 @@
     <!-- Note displayed when certain features are not available on low ram devices. [CHAR LIMIT=NONE] -->
     <string name="disabled_low_ram_device">This feature is not available on this device</string>
 
-    <!--Label of IMS registration header -->
-    <string name="ims_reg_title">"IMS registration state"</string>
-    <!--Used when IMS registration state is registered -->
-    <string name="ims_reg_status_registered">"Registered"</string>
-    <!--Used when IMS registration state is not registered -->
-    <string name="ims_reg_status_not_registered">"Not registered"</string>
 </resources>
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
index 3456f91..07bbc4e 100644
--- a/res/xml/device_info_status.xml
+++ b/res/xml/device_info_status.xml
@@ -83,13 +83,6 @@
         android:summary="@string/summary_placeholder"
         android:persistent="false" />
     <Preference
-        android:key="wimax_mac_address"
-        android:enabled="false"
-        android:shouldDisableView="false"
-        android:title="@string/status_wimax_mac_address"
-        android:summary="@string/summary_placeholder"
-        android:persistent="false" />
-    <Preference
         android:key="ims_reg_state"
         android:enabled="false"
         android:shouldDisableView="false"
diff --git a/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
new file mode 100644
index 0000000..431ead5
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractBluetoothAddressPreferenceController;
+
+/**
+ * Concrete subclass of bluetooth address preference controller
+ */
+public class BluetoothAddressPreferenceController extends
+        AbstractBluetoothAddressPreferenceController implements PreferenceControllerMixin {
+    public BluetoothAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
new file mode 100644
index 0000000..07bd4a6
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractImsStatusPreferenceController;
+
+/**
+ * Concrete subclass of IMS status preference controller
+ */
+public class ImsStatusPreferenceController extends AbstractImsStatusPreferenceController
+        implements PreferenceControllerMixin {
+    public ImsStatusPreferenceController(Context context,
+            Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
new file mode 100644
index 0000000..f4e2f8c
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractIpAddressPreferenceController;
+
+/**
+ * Concrete subclass of IP address preference controller
+ */
+public class IpAddressPreferenceController extends AbstractIpAddressPreferenceController implements
+        PreferenceControllerMixin {
+    public IpAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 228774f..080becc 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -16,115 +16,45 @@
 
 package com.android.settings.deviceinfo;
 
-import android.bluetooth.BluetoothAdapter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.os.SystemClock;
-import android.os.SystemProperties;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 
-import java.lang.ref.WeakReference;
 import java.util.Arrays;
 import java.util.List;
 
-import static android.content.Context.CONNECTIVITY_SERVICE;
-import static android.content.Context.WIFI_SERVICE;
-
+/**
+ * Fragment for showing device hardware info, such as MAC addresses and serial numbers
+ */
 public class Status extends SettingsPreferenceFragment implements Indexable {
 
     private static final String KEY_BATTERY_STATUS = "battery_status";
     private static final String KEY_BATTERY_LEVEL = "battery_level";
-    private static final String KEY_IP_ADDRESS = "wifi_ip_address";
-    private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
-    private static final String KEY_BT_ADDRESS = "bt_address";
-    private static final String KEY_WIMAX_MAC_ADDRESS = "wimax_mac_address";
     private static final String KEY_SIM_STATUS = "sim_status";
     private static final String KEY_IMEI_INFO = "imei_info";
-    private static final String KEY_IMS_REGISTRATION_STATE = "ims_reg_state";
-
-    // Broadcasts to listen to for connectivity changes.
-    private static final String[] CONNECTIVITY_INTENTS = {
-            BluetoothAdapter.ACTION_STATE_CHANGED,
-            ConnectivityManager.CONNECTIVITY_ACTION,
-            WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,
-            WifiManager.NETWORK_STATE_CHANGED_ACTION,
-    };
-
-    private static final int EVENT_UPDATE_STATS = 500;
-
-    private static final int EVENT_UPDATE_CONNECTIVITY = 600;
-
-    private ConnectivityManager mCM;
-    private WifiManager mWifiManager;
-
-    private Resources mRes;
-
-    private String mUnavailable;
 
     private SerialNumberPreferenceController mSerialNumberPreferenceController;
-
-    private Preference mUptime;
+    private UptimePreferenceController mUptimePreferenceController;
     private Preference mBatteryStatus;
     private Preference mBatteryLevel;
-    private Preference mBtAddress;
-    private Preference mIpAddress;
-    private Preference mWifiMacAddress;
-    private Preference mWimaxMacAddress;
-    private Preference mImsStatus;
-
-    private Handler mHandler;
-
-    private static class MyHandler extends Handler {
-        private WeakReference<Status> mStatus;
-
-        public MyHandler(Status activity) {
-            mStatus = new WeakReference<Status>(activity);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            Status status = mStatus.get();
-            if (status == null) {
-                return;
-            }
-
-            switch (msg.what) {
-                case EVENT_UPDATE_STATS:
-                    status.updateTimes();
-                    sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
-                    break;
-
-                case EVENT_UPDATE_CONNECTIVITY:
-                    status.updateConnectivity();
-                    break;
-            }
-        }
-    }
+    private BluetoothAddressPreferenceController mBluetoothAddressPreferenceController;
+    private IpAddressPreferenceController mIpAddressPreferenceController;
+    private WifiMacAddressPreferenceController mWifiMacAddressPreferenceController;
+    private ImsStatusPreferenceController mImsStatusPreferenceController;
 
     private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
 
@@ -138,68 +68,33 @@
         }
     };
 
-    private IntentFilter mConnectivityIntentFilter;
-    private final BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (ArrayUtils.contains(CONNECTIVITY_INTENTS, action)) {
-                mHandler.sendEmptyMessage(EVENT_UPDATE_CONNECTIVITY);
-            }
-        }
-    };
-
-    private boolean hasBluetooth() {
-        return BluetoothAdapter.getDefaultAdapter() != null;
-    }
-
-    private boolean hasWimax() {
-        return  mCM.getNetworkInfo(ConnectivityManager.TYPE_WIMAX) != null;
-    }
-
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        mHandler = new MyHandler(this);
-
-        mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
-        mSerialNumberPreferenceController = new SerialNumberPreferenceController(getActivity());
+        final Context context = getContext();
+        final Lifecycle lifecycle = getLifecycle();
+        mSerialNumberPreferenceController = new SerialNumberPreferenceController(context);
+        mUptimePreferenceController = new UptimePreferenceController(context, lifecycle);
+        mBluetoothAddressPreferenceController =
+                new BluetoothAddressPreferenceController(context, lifecycle);
+        mIpAddressPreferenceController = new IpAddressPreferenceController(context, lifecycle);
+        mWifiMacAddressPreferenceController =
+                new WifiMacAddressPreferenceController(context, lifecycle);
+        mImsStatusPreferenceController = new ImsStatusPreferenceController(context, lifecycle);
 
         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);
-        mImsStatus = findPreference(KEY_IMS_REGISTRATION_STATE);
 
-        mRes = getResources();
-        mUnavailable = mRes.getString(R.string.status_unavailable);
-
-        // Note - missing in zaku build, be careful later...
-        mUptime = findPreference("up_time");
         final PreferenceScreen screen = getPreferenceScreen();
-        if (!hasBluetooth()) {
-            screen.removePreference(mBtAddress);
-            mBtAddress = null;
-        }
-
-        if (!hasWimax()) {
-            screen.removePreference(mWimaxMacAddress);
-            mWimaxMacAddress = null;
-        }
-
-        mConnectivityIntentFilter = new IntentFilter();
-        for (String intent: CONNECTIVITY_INTENTS) {
-             mConnectivityIntentFilter.addAction(intent);
-        }
-
-        updateConnectivity();
 
         mSerialNumberPreferenceController.displayPreference(screen);
+        mUptimePreferenceController.displayPreference(screen);
+        mBluetoothAddressPreferenceController.displayPreference(screen);
+        mIpAddressPreferenceController.displayPreference(screen);
+        mWifiMacAddressPreferenceController.displayPreference(screen);
+        mImsStatusPreferenceController.displayPreference(screen);
 
         // Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
         // Also remove on Wi-Fi only devices.
@@ -219,11 +114,8 @@
     @Override
     public void onResume() {
         super.onResume();
-        getContext().registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
-                         android.Manifest.permission.CHANGE_NETWORK_STATE, null);
         getContext().registerReceiver(mBatteryInfoReceiver,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-        mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
     }
 
     @Override
@@ -231,8 +123,6 @@
         super.onPause();
 
         getContext().unregisterReceiver(mBatteryInfoReceiver);
-        getContext().unregisterReceiver(mConnectivityReceiver);
-        mHandler.removeMessages(EVENT_UPDATE_STATS);
     }
 
     /**
@@ -246,96 +136,6 @@
         }
     }
 
-    private void setWimaxStatus() {
-        if (mWimaxMacAddress != null) {
-            String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
-            mWimaxMacAddress.setSummary(macAddress);
-        }
-    }
-
-    private void setWifiStatus() {
-        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-        boolean hasMacAddress = wifiInfo != null && wifiInfo.hasRealMacAddress();
-        String macAddress = hasMacAddress ? wifiInfo.getMacAddress() : null;
-        mWifiMacAddress.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : mUnavailable);
-    }
-
-    private void setIpAddressStatus() {
-        String ipAddress = Utils.getDefaultIpAddresses(this.mCM);
-        if (ipAddress != null) {
-            mIpAddress.setSummary(ipAddress);
-        } else {
-            mIpAddress.setSummary(mUnavailable);
-        }
-    }
-
-    private void setBtStatus() {
-        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
-        if (bluetooth != null && mBtAddress != null) {
-            String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
-            if (!TextUtils.isEmpty(address)) {
-               // Convert the address to lowercase for consistency with the wifi MAC address.
-                mBtAddress.setSummary(address.toLowerCase());
-            } else {
-                mBtAddress.setSummary(mUnavailable);
-            }
-        }
-    }
-
-    private void setImsRegistrationStatus() {
-        CarrierConfigManager configManager = (CarrierConfigManager)
-                getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        int subId = SubscriptionManager.getDefaultDataSubscriptionId();
-        PersistableBundle config = null;
-        if (configManager != null) {
-            config = configManager.getConfigForSubId(subId);
-        }
-        if (config != null && config.getBoolean(
-                CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)) {
-            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-            mImsStatus.setSummary((tm != null && tm.isImsRegistered(subId)) ?
-                    R.string.ims_reg_status_registered : R.string.ims_reg_status_not_registered);
-        } else {
-            removePreferenceFromScreen(KEY_IMS_REGISTRATION_STATE);
-            mImsStatus = null;
-        }
-    }
-
-    void updateConnectivity() {
-        setWimaxStatus();
-        setWifiStatus();
-        setBtStatus();
-        setIpAddressStatus();
-        setImsRegistrationStatus();
-    }
-
-    void updateTimes() {
-        long at = SystemClock.uptimeMillis() / 1000;
-        long ut = SystemClock.elapsedRealtime() / 1000;
-
-        if (ut == 0) {
-            ut = 1;
-        }
-
-        mUptime.setSummary(convert(ut));
-    }
-
-    private String pad(int n) {
-        if (n >= 10) {
-            return String.valueOf(n);
-        } else {
-            return "0" + String.valueOf(n);
-        }
-    }
-
-    private String convert(long t) {
-        int s = (int)(t % 60);
-        int m = (int)((t / 60) % 60);
-        int h = (int)((t / 3600));
-
-        return h + ":" + pad(m) + ":" + pad(s);
-    }
-
     /**
      * For Search.
      */
diff --git a/src/com/android/settings/deviceinfo/UptimePreferenceController.java b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
new file mode 100644
index 0000000..8bb0df7
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractUptimePreferenceController;
+
+/**
+ * Concrete subclass of uptime preference controller
+ */
+public class UptimePreferenceController extends AbstractUptimePreferenceController
+        implements PreferenceControllerMixin {
+    public UptimePreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
new file mode 100644
index 0000000..92390d7
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 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.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractWifiMacAddressPreferenceController;
+
+/**
+ * Concrete subclass of WIFI MAC address preference controller
+ */
+public class WifiMacAddressPreferenceController extends AbstractWifiMacAddressPreferenceController
+        implements PreferenceControllerMixin {
+    public WifiMacAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
