diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java
index 472a2eb..67a8f50 100644
--- a/src/com/android/settings/SettingsDumpService.java
+++ b/src/com/android/settings/SettingsDumpService.java
@@ -16,14 +16,18 @@
 
 import android.app.Service;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.net.ConnectivityManager;
 import android.net.NetworkTemplate;
+import android.net.Uri;
 import android.os.IBinder;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.applications.ProcStatsData;
 import com.android.settingslib.net.DataUsageController;
 import org.json.JSONArray;
@@ -35,6 +39,13 @@
 import java.io.PrintWriter;
 
 public class SettingsDumpService extends Service {
+    @VisibleForTesting static final String KEY_SERVICE = "service";
+    @VisibleForTesting static final String KEY_STORAGE = "storage";
+    @VisibleForTesting static final String KEY_DATAUSAGE = "datausage";
+    @VisibleForTesting static final String KEY_MEMORY = "memory";
+    @VisibleForTesting static final String KEY_DEFAULT_BROWSER_APP = "default_browser_app";
+    @VisibleForTesting static final Intent BROWSER_INTENT =
+            new Intent("android.intent.action.VIEW", Uri.parse("http://"));
 
     @Override
     public IBinder onBind(Intent intent) {
@@ -46,10 +57,11 @@
         JSONObject dump = new JSONObject();
 
         try {
-            dump.put("service", "Settings State");
-            dump.put("storage", dumpStorage());
-            dump.put("datausage", dumpDataUsage());
-            dump.put("memory", dumpMemory());
+            dump.put(KEY_SERVICE, "Settings State");
+            dump.put(KEY_STORAGE, dumpStorage());
+            dump.put(KEY_DATAUSAGE, dumpDataUsage());
+            dump.put(KEY_MEMORY, dumpMemory());
+            dump.put(KEY_DEFAULT_BROWSER_APP, dumpDefaultBrowser());
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -127,4 +139,16 @@
         }
         return obj;
     }
+
+    @VisibleForTesting
+    String dumpDefaultBrowser() {
+        final ResolveInfo resolveInfo = getPackageManager().resolveActivity(
+                BROWSER_INTENT, PackageManager.MATCH_DEFAULT_ONLY);
+
+        if (resolveInfo == null || resolveInfo.activityInfo.packageName.equals("android")) {
+            return null;
+        } else {
+            return resolveInfo.activityInfo.packageName;
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
new file mode 100644
index 0000000..043b0fe
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 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;
+
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.support.annotation.NonNull;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SettingsDumpServiceTest {
+    private static final String PACKAGE_BROWSER = "com.android.test.browser";
+    private static final String PACKAGE_NULL = "android";
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ResolveInfo mResolveInfo;
+    private TestService mTestService;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mPackageManager.resolveActivity(TestService.BROWSER_INTENT,
+                PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mResolveInfo);
+        mTestService = new TestService();
+        mTestService.setPackageManager(mPackageManager);
+    }
+
+    @Test
+    public void testDumpDefaultBrowser_DefaultBrowser_ReturnBrowserName() {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
+
+        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(PACKAGE_BROWSER);
+    }
+
+    @Test
+    public void testDumpDefaultBrowser_NoDefault_ReturnNull() {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_NULL;
+
+        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(null);
+    }
+
+    @Test
+    public void testDump_ReturnJsonObject() throws JSONException {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
+        TestPrintWriter printWriter = new TestPrintWriter(System.out);
+
+        mTestService.dump(null, printWriter, null);
+        JSONObject object = (JSONObject)printWriter.getPrintObject();
+
+        assertThat(object.get(TestService.KEY_SERVICE)).isNotNull();
+    }
+
+    /**
+     * Test service used to pass in the mock {@link PackageManager}
+     */
+    private class TestService extends SettingsDumpService {
+        private PackageManager mPm;
+
+        public void setPackageManager(PackageManager pm) {
+            mPm = pm;
+        }
+
+        @Override
+        public PackageManager getPackageManager() {
+            return mPm;
+        }
+    }
+
+    /**
+     * Test printWriter to store the object to be printed
+     */
+    private class TestPrintWriter extends PrintWriter {
+        private Object mPrintObject;
+
+        public TestPrintWriter(@NonNull OutputStream out) {
+            super(out);
+        }
+
+        @Override
+        public void println(Object object) {
+            mPrintObject = object;
+        }
+
+        public Object getPrintObject() {
+            return mPrintObject;
+        }
+    }
+}
