diff --git a/InCallUI/res/values/qtistrings.xml b/InCallUI/res/values/qtistrings.xml
index eba800a..5876c87 100644
--- a/InCallUI/res/values/qtistrings.xml
+++ b/InCallUI/res/values/qtistrings.xml
@@ -91,6 +91,7 @@
     <string name="qti_ims_onscreenAssuredTransfer">Assured Transfer</string>
     <!-- Text for the onscreen "consultative transfer" button -->
     <string name="qti_ims_onscreenConsultativeTransfer">Consultative Transfer</string>
+    <string name="qti_call_transfer_title">Call Transfer</string>
 
     <!-- Message indicating video calls not allowed if user enabled TTY Mode -->
     <string name="video_call_not_allowed_if_tty_enabled">Please disable TTY Mode to upgrade to video calls.</string>
@@ -99,6 +100,7 @@
     <string name="qti_description_target_deflect">Deflect</string>
     <string name="qti_description_deflect_error">Number not set. Provide the number via IMS settings and retry.</string>
     <string name="qti_description_deflect_service_error">Call Deflection service is not supported.</string>
+    <string name="qti_deflect_title">Deflect Number</string>
     <!-- Message indicating call failed due to handover not feasible -->
     <string name="call_failed_ho_not_feasible">Call was ended as LTE to 3G/2G handover was not feasible.</string>
     <!-- Text for the onscreen "Add Participant" button -->
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
index 5333058..11cdfda 100644
--- a/InCallUI/src/com/android/incallui/AnswerFragment.java
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -16,10 +16,13 @@
 
 package com.android.incallui;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -274,8 +277,32 @@
         getPresenter().onText();
     }
 
-    public void onDeflect(Context context) {
-        getPresenter().onDeflect(context);
+    public void onDeflectNumberSelect(Context context) {
+        getPresenter().setDeflectCallId();
+        Intent dialogIntent = new Intent("com.qti.editnumber.INTENT_ACTION_LAUNCH_DIALOG");
+        dialogIntent.putExtra(QtiCallUtils.INTENT_EXTRA_DIALOG_TITLE,
+                getResources().getString(R.string.qti_deflect_title));
+        try {
+            startActivityForResult(dialogIntent, QtiCallUtils.ACTIVITY_REQUEST_ENTER_NUMBER);
+        } catch (ActivityNotFoundException e) {
+            Log.e(this, "Unable to launch EditNumberUI Dialog");
+        }
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        String number = null;
+        if (data == null) {
+            Log.w(this, "Data is null from intent" );
+            return;
+        }
+
+        if ((requestCode == QtiCallUtils.ACTIVITY_REQUEST_ENTER_NUMBER) &&
+                (resultCode == Activity.RESULT_OK)) {
+            Bundle b = data.getExtras();
+            number = b.getString("Number");
+        }
+        getPresenter().onDeflect(getContext(), number);
     }
 
     /**
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index b8b5185..ca08b52 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -360,30 +360,23 @@
     /**
      * Deflect the incoming call.
      */
-    public void onDeflect(Context context) {
+    public void onDeflect(Context context, String deflectCallNumber) {
         if (mCallId == null) {
             return;
         }
-        Log.d(this, "onDeflect " + mCallId);
 
-        String deflectCallNumber = QtiImsExtUtils.getCallDeflectNumber(
-                                           context.getContentResolver());
-        /* If not set properly, inform user via toast */
-        if (deflectCallNumber == null) {
-            Log.w(this, "getCallDeflectNumber is null or Empty.");
-            QtiCallUtils.displayToast(context, R.string.qti_description_deflect_error);
-        } else {
-            int phoneId = 0;
-            try {
-                Log.d(this, "Sending deflect request with Phone id " + phoneId +
-                        " to " + deflectCallNumber);
-                QtiImsExtManager.getInstance().sendCallDeflectRequest(phoneId,
-                        deflectCallNumber, imsInterfaceListener);
-             } catch (QtiImsException e) {
-                 Log.e(this, "sendCallDeflectRequest exception " + e);
-                 QtiCallUtils.displayToast(getUi().getContext(),
-                         R.string.qti_description_deflect_service_error);
-             }
+        Log.d(this, "onDeflect mCallId:" + mCallId + "deflectCallNumber:" + deflectCallNumber);
+
+        int phoneId = 0;
+        try {
+            Log.d(this, "Sending deflect request with Phone id " + phoneId +
+                    " to " + deflectCallNumber);
+            QtiImsExtManager.getInstance().sendCallDeflectRequest(phoneId,
+                    deflectCallNumber, imsInterfaceListener);
+        } catch (QtiImsException e) {
+             Log.e(this, "sendCallDeflectRequest exception " + e);
+             QtiCallUtils.displayToast(getUi().getContext(),
+                     R.string.qti_description_deflect_service_error);
         }
     }
 
@@ -486,4 +479,10 @@
             Log.d(this, "No incoming call present for sub = " + subId + " " + this);
         }
     }
+
+    public void setDeflectCallId () {
+        if (mCalls != null) {
+            QtiCallUtils.setDeflectOrTransferCallId(mCalls.getIncomingCall().getId());
+        }
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index 7694c5f..cdc0359 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -38,7 +38,10 @@
 import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_VO_VIDEO_CALL;
 import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_ADD_PARTICIPANT;
 
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
@@ -87,6 +90,10 @@
     // The button has been collapsed into the overflow menu
     private static final int BUTTON_MENU = 3;
 
+    private static final int INVALID_CALL_TRANSFER_TYPE = 1000;
+
+    private int mCallTransferType = INVALID_CALL_TRANSFER_TYPE;
+
     public interface Buttons {
 
         public static final int BUTTON_AUDIO = 0;
@@ -273,11 +280,13 @@
             getPresenter().pauseVideoClicked(
                     !mPauseVideoButton.isSelected() /* pause */);
         } else if (id == R.id.blindTransfer) {
-            getPresenter().callTransferClicked(QtiImsExtUtils.QTI_IMS_BLIND_TRANSFER);
+            mCallTransferType = QtiImsExtUtils.QTI_IMS_BLIND_TRANSFER;
+            onCallTransferNumberSelect(getContext());
         } else if (id == R.id.assuredTransfer) {
-            getPresenter().callTransferClicked(QtiImsExtUtils.QTI_IMS_ASSURED_TRANSFER);
+            mCallTransferType = QtiImsExtUtils.QTI_IMS_ASSURED_TRANSFER;
+            onCallTransferNumberSelect(getContext());
         } else if (id == R.id.consultativeTransfer) {
-            getPresenter().callTransferClicked(QtiImsExtUtils.QTI_IMS_CONSULTATIVE_TRANSFER);
+            getPresenter().callTransferClicked(QtiImsExtUtils.QTI_IMS_CONSULTATIVE_TRANSFER, null);
         } else if (id == R.id.overflowButton) {
             if (mOverflowPopup != null) {
                 updateRecordMenu();
@@ -309,6 +318,36 @@
                 HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
     }
 
+    public void onCallTransferNumberSelect(Context context) {
+        getPresenter().setCallTransferCallId();
+        Intent dialogIntent = new Intent("com.qti.editnumber.INTENT_ACTION_LAUNCH_DIALOG");
+        dialogIntent.putExtra(QtiCallUtils.INTENT_EXTRA_DIALOG_TITLE,
+                getResources().getString(R.string.qti_call_transfer_title));
+        try {
+            startActivityForResult(dialogIntent, QtiCallUtils.ACTIVITY_REQUEST_ENTER_NUMBER);
+        } catch (ActivityNotFoundException e) {
+            Log.e(this, "Unable to launch EditNumberUI Dialog");
+        }
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        String number = null;
+        if (data == null) {
+            Log.w(this, "Data is null from intent" );
+            return;
+        }
+
+        if ((requestCode == QtiCallUtils.ACTIVITY_REQUEST_ENTER_NUMBER) &&
+                (resultCode == Activity.RESULT_OK)) {
+            Bundle b = data.getExtras();
+            number = b.getString("Number");
+        }
+        if (mCallTransferType != INVALID_CALL_TRANSFER_TYPE) {
+            getPresenter().callTransferClicked(mCallTransferType, number);
+        }
+    }
+
     private void updateRecordMenu() {
         MenuItem item = mOverflowPopup.getMenu().findItem(BUTTON_RECORD);
         if (item != null) {
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index 8af8835..ec330a2 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -425,22 +425,8 @@
         getUi().setVideoPaused(pause);
     }
 
-    public void callTransferClicked(int type) {
-        String number = null;
+    public void callTransferClicked(int type, String number) {
         Context mContext = getUi().getContext();
-        if (type != QtiImsExtUtils.QTI_IMS_CONSULTATIVE_TRANSFER) {
-            /**
-             * Since there are no editor options available to provide a number during
-             * blind or assured transfer, for now, making use of the existing
-             * call deflection editor to provide the required number.
-             */
-            number = QtiImsExtUtils.getCallDeflectNumber(mContext.getContentResolver());
-            if (number == null) {
-                 QtiCallUtils.displayToast(mContext, R.string.qti_ims_transfer_num_error);
-                return;
-            }
-        }
-
         boolean status = mCall.sendCallTransferRequest(type, number);
         if (!status) {
             QtiCallUtils.displayToast(mContext, R.string.qti_ims_transfer_request_error);
@@ -672,4 +658,10 @@
             ui.updateColors();
         }
     }
+
+    public void setCallTransferCallId() {
+        if (mCall != null) {
+            QtiCallUtils.setDeflectOrTransferCallId(mCall.getId());
+        }
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/GlowPadWrapper.java b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
index c88a984..84efd7f 100644
--- a/InCallUI/src/com/android/incallui/GlowPadWrapper.java
+++ b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
@@ -139,7 +139,7 @@
             mAnswerFragment.onAnswer(VideoProfile.STATE_RX_ENABLED, getContext());
             mTargetTriggered = true;
         } else if (resId == R.drawable.qti_ic_lockscreen_deflect) {
-            mAnswerFragment.onDeflect(getContext());
+            mAnswerFragment.onDeflectNumberSelect(getContext());
             mTargetTriggered = true;
         } else {
             // Code should never reach here.
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 0acc35e..bbf7ff6 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -65,6 +65,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -743,6 +744,13 @@
     public void onDisconnect(Call call) {
         maybeShowErrorDialogOnDisconnect(call);
 
+        // Send broadcast to dismiss deflect dialog.
+        if (Objects.equals(call.getId(), QtiCallUtils.getDeflectOrTransferCallId())) {
+            Intent intent = new Intent(QtiCallUtils.INTENT_ACTION_DIALOG_DISMISS);
+            mInCallActivity.sendBroadcast(intent);
+            QtiCallUtils.setDeflectOrTransferCallId(null);
+        }
+
         // We need to do the run the same code as onCallListChange.
         onCallListChange(mCallList);
 
diff --git a/InCallUI/src/com/android/incallui/QtiCallUtils.java b/InCallUI/src/com/android/incallui/QtiCallUtils.java
index 6a4383a..0c85a0b 100644
--- a/InCallUI/src/com/android/incallui/QtiCallUtils.java
+++ b/InCallUI/src/com/android/incallui/QtiCallUtils.java
@@ -61,6 +61,15 @@
     private static String LOG_TAG = "QtiCallUtils";
 
     /**
+     * Edit number variables for  deflect/call transfer feature.
+     */
+    public static final int ACTIVITY_REQUEST_ENTER_NUMBER = 1;
+    public static final String INTENT_EXTRA_DIALOG_TITLE = "Title";
+    public static final String INTENT_ACTION_DIALOG_DISMISS =
+            "com.qti.editnumber.INTENT_ACTION_DIALOG_DISMISS";
+    private static String mEditNumberCallId;
+
+    /**
      * Private constructor for QtiCallUtils as we don't want to instantiate this class
      */
     private QtiCallUtils() {
@@ -542,4 +551,15 @@
         return hasVoiceCapabilities(call) || hasTransmitVideoCapabilities(call)
                 || hasReceiveVideoCapabilities(call);
     }
+
+    public static String getDeflectOrTransferCallId() {
+        if (mEditNumberCallId != null) {
+            return mEditNumberCallId;
+        }
+        return null;
+    }
+
+    public static void setDeflectOrTransferCallId(String CallId) {
+        mEditNumberCallId = CallId;
+    }
 }
