diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 9c4de4b..d3c77f3 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -19,9 +19,6 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.PersistableBundle;
@@ -35,7 +32,6 @@
 import android.support.v7.preference.PreferenceGroup;
 import android.telephony.CarrierConfigManager;
 import android.text.TextUtils;
-import android.text.format.DateFormat;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -43,25 +39,15 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.DeviceInfoUtils;
 
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.List;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 public class DeviceInfoSettings extends SettingsPreferenceFragment implements Indexable {
 
     private static final String LOG_TAG = "DeviceInfoSettings";
-    private static final String FILENAME_PROC_VERSION = "/proc/version";
-    private static final String FILENAME_MSV = "/sys/board_properties/soc/msv";
 
     private static final String KEY_MANUAL = "manual";
     private static final String KEY_REGULATORY_INFO = "regulatory_info";
@@ -108,28 +94,21 @@
 
         setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE);
         findPreference(KEY_FIRMWARE_VERSION).setEnabled(true);
-        String patch = Build.VERSION.SECURITY_PATCH;
-        if (!"".equals(patch)) {
-            try {
-                SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd");
-                Date patchDate = template.parse(patch);
-                String format = DateFormat.getBestDateTimePattern(Locale.getDefault(), "dMMMMyyyy");
-                patch = DateFormat.format(format, patchDate).toString();
-            } catch (ParseException e) {
-                // broken parse; fall through and use the raw string
-            }
+
+        final String patch = DeviceInfoUtils.getSecurityPatch();
+        if (TextUtils.isEmpty(patch)) {
             setStringSummary(KEY_SECURITY_PATCH, patch);
         } else {
             getPreferenceScreen().removePreference(findPreference(KEY_SECURITY_PATCH));
-
         }
+
         setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband");
-        setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + getMsvSuffix());
+        setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
         setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID);
         setStringSummary(KEY_DEVICE_MODEL, Build.MODEL);
         setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY);
         findPreference(KEY_BUILD_NUMBER).setEnabled(true);
-        findPreference(KEY_KERNEL_VERSION).setSummary(getFormattedKernelVersion());
+        findPreference(KEY_KERNEL_VERSION).setSummary(DeviceInfoUtils.getFormattedKernelVersion());
 
         if (!SELinux.isSELinuxEnabled()) {
             String status = getResources().getString(R.string.selinux_status_disabled);
@@ -157,7 +136,7 @@
         }
 
         // Dont show feedback option if there is no reporter.
-        if (TextUtils.isEmpty(getFeedbackReporterPackage(getActivity()))) {
+        if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(getActivity()))) {
             getPreferenceScreen().removePreference(findPreference(KEY_DEVICE_FEEDBACK));
         }
 
@@ -343,7 +322,7 @@
     }
 
     private void sendFeedback() {
-        String reporterPackage = getFeedbackReporterPackage(getActivity());
+        String reporterPackage = DeviceInfoUtils.getFeedbackReporterPackage(getActivity());
         if (TextUtils.isEmpty(reporterPackage)) {
             return;
         }
@@ -353,118 +332,6 @@
     }
 
     /**
-     * Reads a line from the specified file.
-     * @param filename the file to read from
-     * @return the first line, if any.
-     * @throws IOException if the file couldn't be read
-     */
-    private static String readLine(String filename) throws IOException {
-        BufferedReader reader = new BufferedReader(new FileReader(filename), 256);
-        try {
-            return reader.readLine();
-        } finally {
-            reader.close();
-        }
-    }
-
-    public static String getFormattedKernelVersion() {
-        try {
-            return formatKernelVersion(readLine(FILENAME_PROC_VERSION));
-
-        } catch (IOException e) {
-            Log.e(LOG_TAG,
-                "IO Exception when getting kernel version for Device Info screen",
-                e);
-
-            return "Unavailable";
-        }
-    }
-
-    public static String formatKernelVersion(String rawKernelVersion) {
-        // Example (see tests for more):
-        // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \
-        //     (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \
-        //     Thu Jun 28 11:02:39 PDT 2012
-
-        final String PROC_VERSION_REGEX =
-            "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */
-            "\\((\\S+?)\\) " +        /* group 2: "x@y.com" (kernel builder) */
-            "(?:\\(gcc.+? \\)) " +    /* ignore: GCC version information */
-            "(#\\d+) " +              /* group 3: "#1" */
-            "(?:.*?)?" +              /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */
-            "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */
-
-        Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion);
-        if (!m.matches()) {
-            Log.e(LOG_TAG, "Regex did not match on /proc/version: " + rawKernelVersion);
-            return "Unavailable";
-        } else if (m.groupCount() < 4) {
-            Log.e(LOG_TAG, "Regex match on /proc/version only returned " + m.groupCount()
-                    + " groups");
-            return "Unavailable";
-        }
-        return m.group(1) + "\n" +                 // 3.0.31-g6fb96c9
-            m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1
-            m.group(4);                            // Thu Jun 28 11:02:39 PDT 2012
-    }
-
-    /**
-     * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "".
-     * @return a string to append to the model number description.
-     */
-    private String getMsvSuffix() {
-        // Production devices should have a non-zero value. If we can't read it, assume it's a
-        // production device so that we don't accidentally show that it's an ENGINEERING device.
-        try {
-            String msv = readLine(FILENAME_MSV);
-            // Parse as a hex number. If it evaluates to a zero, then it's an engineering build.
-            if (Long.parseLong(msv, 16) == 0) {
-                return " (ENGINEERING)";
-            }
-        } catch (IOException ioe) {
-            // Fail quietly, as the file may not exist on some devices.
-        } catch (NumberFormatException nfe) {
-            // Fail quietly, returning empty string should be sufficient
-        }
-        return "";
-    }
-
-    private static String getFeedbackReporterPackage(Context context) {
-        final String feedbackReporter =
-                context.getResources().getString(R.string.oem_preferred_feedback_reporter);
-        if (TextUtils.isEmpty(feedbackReporter)) {
-            // Reporter not configured. Return.
-            return feedbackReporter;
-        }
-        // Additional checks to ensure the reporter is on system image, and reporter is
-        // configured to listen to the intent. Otherwise, dont show the "send feedback" option.
-        final Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
-
-        PackageManager pm = context.getPackageManager();
-        List<ResolveInfo> resolvedPackages =
-                pm.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
-        for (ResolveInfo info : resolvedPackages) {
-            if (info.activityInfo != null) {
-                if (!TextUtils.isEmpty(info.activityInfo.packageName)) {
-                    try {
-                        ApplicationInfo ai = pm.getApplicationInfo(info.activityInfo.packageName, 0);
-                        if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
-                            // Package is on the system image
-                            if (TextUtils.equals(
-                                        info.activityInfo.packageName, feedbackReporter)) {
-                                return feedbackReporter;
-                            }
-                        }
-                    } catch (PackageManager.NameNotFoundException e) {
-                         // No need to do anything here.
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
      * For Search.
      */
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
@@ -495,7 +362,7 @@
                     keys.add((KEY_BASEBAND_VERSION));
                 }
                 // Dont show feedback option if there is no reporter.
-                if (TextUtils.isEmpty(getFeedbackReporterPackage(context))) {
+                if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(context))) {
                     keys.add(KEY_DEVICE_FEEDBACK);
                 }
                 final UserManager um = UserManager.get(context);
diff --git a/tests/src/com/android/settings/DeviceInfoSettingsTest.java b/tests/src/com/android/settings/DeviceInfoSettingsTest.java
index d2267c0..abd4d76 100644
--- a/tests/src/com/android/settings/DeviceInfoSettingsTest.java
+++ b/tests/src/com/android/settings/DeviceInfoSettingsTest.java
@@ -18,37 +18,37 @@
 
 import android.test.AndroidTestCase;
 
-import com.android.settings.DeviceInfoSettings;
+import com.android.settingslib.DeviceInfoUtils;
 
 public class DeviceInfoSettingsTest extends AndroidTestCase {
 
     public void testGetFormattedKernelVersion() throws Exception {
-        if ("Unavailable".equals(DeviceInfoSettings.getFormattedKernelVersion())) {
+        if ("Unavailable".equals(DeviceInfoUtils.getFormattedKernelVersion())) {
             fail("formatKernelVersion can't cope with this device's /proc/version");
         }
     }
 
     public void testFormatKernelVersion() throws Exception {
-        assertEquals("Unavailable", DeviceInfoSettings.formatKernelVersion(""));
+        assertEquals("Unavailable", DeviceInfoUtils.formatKernelVersion(""));
         assertEquals("2.6.38.8-gg784\n" +
-                     "root@hpao4.eem.corp.google.com #2\n" +
-                     "Fri Feb 24 03:31:23 PST 2012",
-                     DeviceInfoSettings.formatKernelVersion("Linux version 2.6.38.8-gg784 " +
-                         "(root@hpao4.eem.corp.google.com) " +
-                         "(gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #2 SMP " +
-                         "Fri Feb 24 03:31:23 PST 2012"));
+                        "root@hpao4.eem.corp.google.com #2\n" +
+                        "Fri Feb 24 03:31:23 PST 2012",
+                DeviceInfoUtils.formatKernelVersion("Linux version 2.6.38.8-gg784 " +
+                        "(root@hpao4.eem.corp.google.com) " +
+                        "(gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #2 SMP " +
+                        "Fri Feb 24 03:31:23 PST 2012"));
         assertEquals("3.0.31-g6fb96c9\n" +
-                     "android-build@vpbs1.mtv.corp.google.com #1\n" +
-                     "Thu Jun 28 11:02:39 PDT 2012",
-                     DeviceInfoSettings.formatKernelVersion("Linux version 3.0.31-g6fb96c9 " +
-                         "(android-build@vpbs1.mtv.corp.google.com) " +
-                         "(gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 " +
-                         "SMP PREEMPT Thu Jun 28 11:02:39 PDT 2012"));
+                        "android-build@vpbs1.mtv.corp.google.com #1\n" +
+                        "Thu Jun 28 11:02:39 PDT 2012",
+                DeviceInfoUtils.formatKernelVersion("Linux version 3.0.31-g6fb96c9 " +
+                        "(android-build@vpbs1.mtv.corp.google.com) " +
+                        "(gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 " +
+                        "SMP PREEMPT Thu Jun 28 11:02:39 PDT 2012"));
         assertEquals("2.6.38.8-a-b-jellybean+\n" +
-                     "x@y #1\n" +
-                     "Tue Aug 28 22:10:46 CDT 2012",
-                     DeviceInfoSettings.formatKernelVersion("Linux version " +
-                         "2.6.38.8-a-b-jellybean+ (x@y) " +
-                         "(gcc version 4.4.3 (GCC) ) #1 PREEMPT Tue Aug 28 22:10:46 CDT 2012"));
+                        "x@y #1\n" +
+                        "Tue Aug 28 22:10:46 CDT 2012",
+                DeviceInfoUtils.formatKernelVersion("Linux version " +
+                        "2.6.38.8-a-b-jellybean+ (x@y) " +
+                        "(gcc version 4.4.3 (GCC) ) #1 PREEMPT Tue Aug 28 22:10:46 CDT 2012"));
     }
 }
