diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 31b2f84..5547624 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -224,6 +224,18 @@
                 android:process=":ui">
         </activity>
 
+        <activity android:name=".components.ChangeDefaultDialerDialog"
+                  android:label="@string/change_default_dialer_dialog_title"
+                  android:excludeFromRecents="true"
+                  android:theme="@*android:style/Theme.Material.Light.Dialog.Alert"
+                  android:priority="1000"
+                  android:process=":ui" >
+            <intent-filter>
+                <action android:name="android.telecom.action.CHANGE_DEFAULT_DIALER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <receiver android:name=".components.PrimaryCallReceiver"
                 android:exported="true"
                 android:permission="android.permission.MODIFY_PHONE_STATE"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b09cdce..ce010da 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -94,6 +94,15 @@
     <!-- Button label on the "Missing voicemail number" dialog -->
     <string name="add_vm_number_str">Add number</string>
 
+    <!-- Title of dialog used to comfirm whether the user intends to change the default dialer
+            application [CHAR LIMIT=55]-->
+    <string name="change_default_dialer_dialog_title">Change default Dialer app?</string>
+    <!-- Text in dialog used to confirm whether or not the user intends to change the default dialer, if a different default dialer has been previously set. -->
+    <string name="change_default_dialer_with_previous_app_set_text">Use <xliff:g id="new_app">%1$s</xliff:g> instead of <xliff:g id="current_app">%2$s</xliff:g> as your default dialer app?</string>
+    <!-- Text in dialog used to confirm whether or not the user intends to change the default dialer, if a different default dialer has not been previously set. -->
+    <string name="change_default_dialer_no_previous_app_set_text">Use <xliff:g id="new_app">%s</xliff:g> as your default dialer app?</string>
+
+
     <!-- DO NOT TRANSLATE. Label for test Subscription 0. -->
     <string name="test_account_0_label">Q Mobile</string>
     <!-- DO NOT TRANSLATE. Label for test Subscription 1. -->
diff --git a/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java b/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java
new file mode 100644
index 0000000..253d0ab
--- /dev/null
+++ b/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2015 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.server.telecom.components;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
+import android.telecom.DefaultDialerManager;
+import android.telecom.TelecomManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.server.telecom.R;
+
+public class ChangeDefaultDialerDialog extends AlertActivity implements
+        DialogInterface.OnClickListener{
+    private static final String TAG = ChangeDefaultDialerDialog.class.getSimpleName();
+    private String mNewPackage;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final String packageName = getIntent().getStringExtra(
+                TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME);
+
+        if (!buildDialog(packageName)) {
+            setResult(RESULT_CANCELED);
+            finish();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        switch (which) {
+            case BUTTON_POSITIVE:
+                DefaultDialerManager.setDefaultDialerApplication(ChangeDefaultDialerDialog.this,
+                        mNewPackage);
+                setResult(RESULT_OK);
+                break;
+            case BUTTON_NEGATIVE:
+                setResult(RESULT_CANCELED);
+                break;
+        }
+    }
+
+    private boolean buildDialog(String newPackage) {
+        mNewPackage = newPackage;
+        final TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
+        if (!tm.isVoiceCapable()) {
+            Log.w(TAG, "Dialog launched but device is not voice capable.");
+            return false;
+        }
+
+        if (!DefaultDialerManager.getInstalledDialerApplications(this).contains(mNewPackage)) {
+            Log.w(TAG, "Provided package name does not correspond to an installed Dialer "
+                    + "application.");
+            return false;
+        }
+
+        final String oldPackage = DefaultDialerManager.getDefaultDialerApplication(this);
+        if (!TextUtils.isEmpty(oldPackage) && TextUtils.equals(oldPackage, mNewPackage)) {
+            Log.w(TAG, "Provided package name is already the current default Dialer application.");
+            return false;
+        }
+
+        final PackageManager pm = getPackageManager();
+        final String newPackageLabel =
+                getApplicationLabelForPackageName(pm, mNewPackage);
+        final AlertController.AlertParams p = mAlertParams;
+        p.mTitle = getString(R.string.change_default_dialer_dialog_title);
+        if (!TextUtils.isEmpty(oldPackage)) {
+            String oldPackageLabel =
+                    getApplicationLabelForPackageName(pm, oldPackage);
+            p.mMessage = getString(R.string.change_default_dialer_with_previous_app_set_text,
+                    newPackageLabel,
+                    oldPackageLabel);
+        } else {
+            p.mMessage = getString(R.string.change_default_dialer_no_previous_app_set_text,
+                    newPackageLabel);
+        }
+        p.mPositiveButtonText = getString(android.R.string.yes);
+        p.mNegativeButtonText = getString(android.R.string.no);
+        p.mPositiveButtonListener = this;
+        p.mNegativeButtonListener = this;
+        setupAlert();
+
+        return true;
+    }
+
+    /**
+     * Returns the application label that corresponds to the given package name
+     *
+     * @param pm An instance of a {@link PackageManager}.
+     * @param packageName A valid package name.
+     *
+     * @return Application label for the given package name, or null if not found.
+     */
+    private String getApplicationLabelForPackageName(PackageManager pm, String packageName) {
+        ApplicationInfo info = null;
+        try {
+            info = pm.getApplicationInfo(packageName, 0);
+        } catch (NameNotFoundException e) {
+            Log.w(TAG, "Application info not found for packageName " + packageName);
+        }
+        if (info == null) {
+            return packageName;
+        } else {
+            return info.loadLabel(pm).toString();
+        }
+    }
+}
diff --git a/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java b/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
index a756284..4153ee1 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestDialerActivity.java
@@ -17,6 +17,8 @@
 import com.android.server.telecom.testapps.R;
 
 public class TestDialerActivity extends Activity {
+    private static final int REQUEST_CODE_SET_DEFAULT_DIALER = 1;
+
     private EditText mNumberView;
 
     @Override
@@ -56,6 +58,17 @@
     }
 
     @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) {
+            if (resultCode == RESULT_OK) {
+                showToast("User accepted request to become default dialer");
+            } else if (resultCode == RESULT_CANCELED) {
+                showToast("User declined request to become default dialer");
+            }
+        }
+    }
+
+    @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
         updateEditTextWithNumber();
@@ -69,7 +82,9 @@
     }
 
     private void setDefault() {
-        // TODO: Send a request to become the default dialer application
+        final Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
+        intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
+        startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER);
     }
 
     private void placeCall() {
@@ -87,10 +102,14 @@
             values.put(Calls.CACHED_NAME, "hello world");
             getContentResolver().update(Calls.CONTENT_URI_WITH_VOICEMAIL, values, "1=0", null);
         } catch (SecurityException e) {
-            Toast.makeText(this, "Permission check failed", Toast.LENGTH_SHORT).show();
+            showToast("Permission check failed");
             return;
         }
-        Toast.makeText(this, "Permission check succeeded", Toast.LENGTH_SHORT).show();
+        showToast("Permission check succeeded");
+    }
+
+    private void showToast(String message) {
+        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
     }
 
     private void cancelMissedCallNotification() {
