diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index cb9353f..2be3355 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -194,21 +194,6 @@
     /** Info used by the call services. */
     private Bundle mExtras = Bundle.EMPTY;
 
-    /** The Uri to dial to perform the handoff. If this is null then handoff is not supported. */
-    private Uri mHandoffHandle;
-
-    /**
-     * References the call that is being handed off. This value is non-null for untracked calls
-     * that are being used to perform a handoff.
-     */
-    private Call mOriginalCall;
-
-    /**
-     * The descriptor for the call service that this call is being switched to, null if handoff is
-     * not in progress.
-     */
-    private CallServiceDescriptor mHandoffCallServiceDescriptor;
-
     /** Set of listeners on this call. */
     private Set<Listener> mListeners = Sets.newHashSet();
 
@@ -749,8 +734,6 @@
         CallServiceDescriptor descriptor = null;
         if (mCallService != null) {
             descriptor = mCallService.getDescriptor();
-        } else if (mOriginalCall != null && mOriginalCall.mCallService != null) {
-            descriptor = mOriginalCall.mCallService.getDescriptor();
         }
         Bundle extras = mExtras;
         if (mGatewayInfo != null && mGatewayInfo.getGatewayProviderPackageName() != null &&
@@ -800,30 +783,6 @@
         mExtras = extras;
     }
 
-    Uri getHandoffHandle() {
-        return mHandoffHandle;
-    }
-
-    void setHandoffHandle(Uri handoffHandle) {
-        mHandoffHandle = handoffHandle;
-    }
-
-    Call getOriginalCall() {
-        return mOriginalCall;
-    }
-
-    void setOriginalCall(Call originalCall) {
-        mOriginalCall = originalCall;
-    }
-
-    CallServiceDescriptor getHandoffCallServiceDescriptor() {
-        return mHandoffCallServiceDescriptor;
-    }
-
-    void setHandoffCallServiceDescriptor(CallServiceDescriptor descriptor) {
-        mHandoffCallServiceDescriptor = descriptor;
-    }
-
     Uri getRingtone() {
         return mCallerInfo == null ? null : mCallerInfo.contactRingtoneUri;
     }
@@ -838,6 +797,10 @@
         getCallService().onPostDialContinue(this, proceed);
     }
 
+    void phoneAccountClicked() {
+        getCallService().onPhoneAccountClicked(this);
+    }
+
     void conferenceInto(Call conferenceCall) {
         if (mCallService == null) {
             Log.w(this, "conference requested on a call without a call service.");
diff --git a/src/com/android/telecomm/CallServiceWrapper.java b/src/com/android/telecomm/CallServiceWrapper.java
index 5e0d9a8..1414e0a 100644
--- a/src/com/android/telecomm/CallServiceWrapper.java
+++ b/src/com/android/telecomm/CallServiceWrapper.java
@@ -74,10 +74,9 @@
         private static final int MSG_CAN_CONFERENCE = 12;
         private static final int MSG_SET_IS_CONFERENCED = 13;
         private static final int MSG_ADD_CONFERENCE_CALL = 14;
-        private static final int MSG_HANDOFF_CALL = 15;
-        private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 16;
-        private static final int MSG_SET_CALL_VIDEO_PROVIDER = 17;
-        private static final int MSG_SET_FEATURES = 18;
+        private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 15;
+        private static final int MSG_SET_CALL_VIDEO_PROVIDER = 16;
+        private static final int MSG_SET_FEATURES = 17;
 
         private final Handler mHandler = new Handler() {
             @Override
@@ -219,14 +218,6 @@
                         }
                         break;
                     }
-                    case MSG_HANDOFF_CALL:
-                        call = mCallIdMapper.getCall(msg.obj);
-                        if (call != null) {
-                            mCallsManager.startHandoffForCall(call);
-                        } else {
-                            //Log.w(this, "handoffCall, unknown call id: %s", msg.obj);
-                        }
-                        break;
                     case MSG_CAN_CONFERENCE: {
                         call = mCallIdMapper.getCall(msg.obj);
                         if (call != null) {
@@ -465,14 +456,6 @@
             mHandler.obtainMessage(MSG_ON_POST_DIAL_WAIT, args).sendToTarget();
         }
 
-        /** {@inheritDoc} */
-        @Override
-        public void handoffCall(String callId) {
-            logIncoming("handoffCall %s", callId);
-            mCallIdMapper.checkValidCallId(callId);
-            mHandler.obtainMessage(MSG_HANDOFF_CALL, callId).sendToTarget();
-        }
-
         /** ${inheritDoc} */
         @Override
         public void queryRemoteConnectionServices(RemoteServiceCallback callback) {
@@ -750,6 +733,16 @@
         }
     }
 
+    void onPhoneAccountClicked(Call call) {
+        if (isServiceValid("onPhoneAccountClicked")) {
+            try {
+                logOutgoing("onPhoneAccountClicked %s", mCallIdMapper.getCallId(call));
+                mServiceInterface.onPhoneAccountClicked(mCallIdMapper.getCallId(call));
+            } catch (RemoteException ignored) {
+            }
+        }
+    }
+
     void conference(final Call conferenceCall, Call call) {
         if (isServiceValid("conference")) {
             try {
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 0446f43..28e264a 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -51,15 +51,10 @@
         void onCallAdded(Call call);
         void onCallRemoved(Call call);
         void onCallStateChanged(Call call, CallState oldState, CallState newState);
-        void onCallHandoffHandleChanged(Call call, Uri oldHandle, Uri newHandle);
         void onCallServiceChanged(
                 Call call,
                 CallServiceWrapper oldCallService,
                 CallServiceWrapper newCallService);
-        void onCallHandoffCallServiceDescriptorChanged(
-                Call call,
-                CallServiceDescriptor oldDescriptor,
-                CallServiceDescriptor newDescriptor);
         void onIncomingCallAnswered(Call call);
         void onIncomingCallRejected(Call call, boolean rejectWithMessage, String textMessage);
         void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall);
@@ -80,13 +75,6 @@
      */
     private final Set<Call> mCalls = new LinkedHashSet<>();
 
-    /**
-     * Set of new calls created to perform a handoff. The calls are added when handoff is initiated
-     * and removed when hadnoff is complete.
-     */
-    private final Set<Call> mPendingHandoffCalls = new LinkedHashSet<>();
-
-
     private final DtmfLocalTonePlayer mDtmfLocalTonePlayer = new DtmfLocalTonePlayer();
     private final InCallController mInCallController = new InCallController();
     private final CallAudioManager mCallAudioManager;
@@ -139,9 +127,6 @@
             for (CallsManagerListener listener : mListeners) {
                 listener.onCallServiceChanged(call, null, call.getCallService());
             }
-        } else if (mPendingHandoffCalls.contains(call)) {
-            updateHandoffCallServiceDescriptor(call.getOriginalCall(),
-                    call.getCallService().getDescriptor());
         } else {
             Log.wtf(this, "unexpected successful call notification: %s", call);
             return;
@@ -478,33 +463,12 @@
         mCallAudioManager.setAudioRoute(route);
     }
 
-    void startHandoffForCall(Call originalCall) {
-        if (!mCalls.contains(originalCall)) {
-            Log.w(this, "Unknown call %s asked to be handed off", originalCall);
-            return;
+    void phoneAccountClicked(Call call) {
+        if (!mCalls.contains(call)) {
+            Log.i(this, "phoneAccountClicked in a non-existent call %s", call);
+        } else {
+            call.phoneAccountClicked();
         }
-
-        for (Call handoffCall : mPendingHandoffCalls) {
-            if (handoffCall.getOriginalCall() == originalCall) {
-                Log.w(this, "Call %s is already being handed off, skipping", originalCall);
-                return;
-            }
-        }
-
-        // Create a new call to be placed in the background. If handoff is successful then the
-        // original call will live on but its state will be updated to the new call's state. In
-        // particular the original call's call service will be updated to the new call's call
-        // service.
-        Call tempCall = new Call(
-                originalCall.getHandoffHandle(), originalCall.getGatewayInfo(),
-                originalCall.getAccount(), false, false);
-        tempCall.setOriginalCall(originalCall);
-        tempCall.setExtras(originalCall.getExtras());
-        mPendingHandoffCalls.add(tempCall);
-        tempCall.addListener(this);
-
-        Log.d(this, "Placing handoff call");
-        tempCall.startOutgoing();
     }
 
     /** Called when the audio state changes. */
@@ -529,9 +493,6 @@
         }
         setCallState(call, CallState.ACTIVE);
 
-        if (mPendingHandoffCalls.contains(call)) {
-            completeHandoff(call, true);
-        }
         if (call.getStartWithSpeakerphoneOn()) {
             setAudioRoute(CallAudioState.ROUTE_SPEAKER);
         }
@@ -551,33 +512,7 @@
     void markCallAsDisconnected(Call call, int disconnectCause, String disconnectMessage) {
         call.setDisconnectCause(disconnectCause, disconnectMessage);
         setCallState(call, CallState.DISCONNECTED);
-
-        // Only remove the call if handoff is not pending.
-        if (call.getHandoffCallServiceDescriptor() == null) {
-            removeCall(call);
-        }
-    }
-
-    void setHandoffInfo(Call call, Uri handle, Bundle extras) {
-        if (!mCalls.contains(call)) {
-            Log.w(this, "Unknown call (%s) asked to set handoff info", call);
-            return;
-        }
-
-        if (extras == null) {
-            call.setExtras(Bundle.EMPTY);
-        } else {
-            call.setExtras(extras);
-        }
-
-        Uri oldHandle = call.getHandoffHandle();
-        Log.v(this, "set handoff handle %s -> %s, for call: %s", oldHandle, handle, call);
-        if (!areUriEqual(oldHandle, handle)) {
-            call.setHandoffHandle(handle);
-            for (CallsManagerListener listener : mListeners) {
-                listener.onCallHandoffHandleChanged(call, oldHandle, handle);
-            }
-        }
+        removeCall(call);
     }
 
     /**
@@ -692,8 +627,6 @@
     }
 
     private void removeCall(Call call) {
-        // If a handoff is pending then the original call shouldn't be removed.
-        Preconditions.checkState(call.getHandoffCallServiceDescriptor() == null);
         Log.v(this, "removeCall(%s)", call);
 
         call.removeListener(this);
@@ -703,9 +636,6 @@
         if (mCalls.contains(call)) {
             mCalls.remove(call);
             shouldNotify = true;
-        } else if (mPendingHandoffCalls.contains(call)) {
-            Log.v(this, "removeCall, marking handoff call as failed");
-            completeHandoff(call, false);
         }
 
         // Only broadcast changes for calls that are being tracked.
@@ -781,56 +711,6 @@
         }
     }
 
-    private void completeHandoff(Call handoffCall, boolean wasSuccessful) {
-        Call originalCall = handoffCall.getOriginalCall();
-        Log.v(this, "complete handoff, %s -> %s, wasSuccessful: %b", handoffCall, originalCall,
-                wasSuccessful);
-
-        // Remove the transient handoff call object (don't disconnect because the call could still
-        // be live).
-        mPendingHandoffCalls.remove(handoffCall);
-        handoffCall.removeListener(this);
-
-        if (wasSuccessful) {
-            if (TelephonyUtil.isCurrentlyPSTNCall(originalCall)) {
-                originalCall.disconnect();
-            }
-
-            // Synchronize.
-            originalCall.setCallService(handoffCall.getCallService(), handoffCall);
-            setCallState(originalCall, handoffCall.getState());
-
-            // Force the foreground call changed notification to be sent.
-            for (CallsManagerListener listener : mListeners) {
-                listener.onForegroundCallChanged(mForegroundCall, mForegroundCall);
-            }
-
-            updateHandoffCallServiceDescriptor(originalCall, null);
-        } else {
-            updateHandoffCallServiceDescriptor(originalCall, null);
-            if (originalCall.getState() == CallState.DISCONNECTED ||
-                    originalCall.getState() == CallState.ABORTED) {
-                removeCall(originalCall);
-            }
-        }
-    }
-
-    private void updateHandoffCallServiceDescriptor(
-            Call originalCall,
-            CallServiceDescriptor newDescriptor) {
-        CallServiceDescriptor oldDescriptor = originalCall.getHandoffCallServiceDescriptor();
-        Log.v(this, "updateHandoffCallServiceDescriptor, call: %s, pending descriptor: %s -> %s",
-                originalCall, oldDescriptor, newDescriptor);
-
-        if (!areDescriptorsEqual(oldDescriptor, newDescriptor)) {
-            originalCall.setHandoffCallServiceDescriptor(newDescriptor);
-            for (CallsManagerListener listener : mListeners) {
-                listener.onCallHandoffCallServiceDescriptorChanged(originalCall, oldDescriptor,
-                        newDescriptor);
-            }
-        }
-    }
-
     private static boolean areDescriptorsEqual(
             CallServiceDescriptor descriptor1,
             CallServiceDescriptor descriptor2) {
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index 8b03eee..a5320a4 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -38,10 +38,6 @@
     }
 
     @Override
-    public void onCallHandoffHandleChanged(Call call, Uri oldHandle, Uri newHandle) {
-    }
-
-    @Override
     public void onCallServiceChanged(
             Call call,
             CallServiceWrapper oldCallServiceWrapper,
@@ -49,13 +45,6 @@
     }
 
     @Override
-    public void onCallHandoffCallServiceDescriptorChanged(
-            Call call,
-            CallServiceDescriptor oldDescriptor,
-            CallServiceDescriptor newDescriptor) {
-    }
-
-    @Override
     public void onIncomingCallAnswered(Call call) {
     }
 
diff --git a/src/com/android/telecomm/InCallAdapter.java b/src/com/android/telecomm/InCallAdapter.java
index 7937e95..40bb61d 100644
--- a/src/com/android/telecomm/InCallAdapter.java
+++ b/src/com/android/telecomm/InCallAdapter.java
@@ -36,7 +36,7 @@
     private static final int MSG_DISCONNECT_CALL = 5;
     private static final int MSG_HOLD_CALL = 6;
     private static final int MSG_UNHOLD_CALL = 7;
-    private static final int MSG_HANDOFF_CALL = 8;
+    private static final int MSG_PHONE_ACCOUNT_CLICKED = 8;
     private static final int MSG_MUTE = 9;
     private static final int MSG_SET_AUDIO_ROUTE = 10;
     private static final int MSG_CONFERENCE = 11;
@@ -120,12 +120,12 @@
                         Log.w(this, "unholdCall, unknown call id: %s", msg.obj);
                     }
                     break;
-                case MSG_HANDOFF_CALL:
+                case MSG_PHONE_ACCOUNT_CLICKED:
                     call = mCallIdMapper.getCall(msg.obj);
                     if (call != null) {
-                        mCallsManager.startHandoffForCall(call);
+                        mCallsManager.phoneAccountClicked(call);
                     } else {
-                        Log.w(this, "startHandoffForCall, unknown call id: %s", msg.obj);
+                        Log.w(this, "phoneAccountClicked, unknown call id: %s", msg.obj);
                     }
                     break;
                 case MSG_MUTE:
@@ -234,9 +234,9 @@
 
     /** {@inheritDoc} */
     @Override
-    public void handoffCall(String callId) {
+    public void phoneAccountClicked(String callId) {
         mCallIdMapper.checkValidCallId(callId);
-        mHandler.obtainMessage(MSG_HANDOFF_CALL, callId).sendToTarget();
+        mHandler.obtainMessage(MSG_PHONE_ACCOUNT_CLICKED, callId).sendToTarget();
     }
 
     /** {@inheritDoc} */
diff --git a/src/com/android/telecomm/InCallController.java b/src/com/android/telecomm/InCallController.java
index 9b53609..c1c8eaf 100644
--- a/src/com/android/telecomm/InCallController.java
+++ b/src/com/android/telecomm/InCallController.java
@@ -103,11 +103,6 @@
     }
 
     @Override
-    public void onCallHandoffHandleChanged(Call call, Uri oldHandle, Uri newHandle) {
-        updateCall(call);
-    }
-
-    @Override
     public void onCallServiceChanged(
             Call call,
             CallServiceWrapper oldCallServiceWrapper,
@@ -116,14 +111,6 @@
     }
 
     @Override
-    public void onCallHandoffCallServiceDescriptorChanged(
-            Call call,
-            CallServiceDescriptor oldDescriptor,
-            CallServiceDescriptor newDescriptor) {
-        updateCall(call);
-    }
-
-    @Override
     public void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState) {
         if (mInCallService != null) {
             Log.i(this, "Calling onAudioStateChanged, audioState: %s -> %s", oldAudioState,
@@ -277,11 +264,7 @@
         CallServiceDescriptor descriptor =
                 call.getCallService() != null ? call.getCallService().getDescriptor() : null;
 
-        boolean isHandoffCapable = call.getHandoffHandle() != null;
         int capabilities = CallCapabilities.HOLD | CallCapabilities.MUTE;
-        if (call.getHandoffHandle() != null) {
-            capabilities |= CallCapabilities.CONNECTION_HANDOFF;
-        }
         if (CallsManager.getInstance().isAddCallCapable(call)) {
             capabilities |= CallCapabilities.ADD_CALL;
         }
@@ -292,10 +275,6 @@
         if (state == CallState.ABORTED) {
             state = CallState.DISCONNECTED;
         }
-        // TODO(sail): Remove this and replace with final reconnecting code.
-        if (state == CallState.DISCONNECTED && call.getHandoffCallServiceDescriptor() != null) {
-            state = CallState.ACTIVE;
-        }
 
         String parentCallId = null;
         Call parentCall = call.getParentCall();
@@ -320,8 +299,7 @@
 
         return new InCallCall(callId, state, call.getDisconnectCause(), call.getDisconnectMessage(),
                 call.getCannedSmsResponses(), capabilities, connectTimeMillis, call.getHandle(),
-                call.getGatewayInfo(), call.getAccount(), descriptor,
-                call.getHandoffCallServiceDescriptor(), call.getCallVideoProvider(),
+                call.getGatewayInfo(), call.getAccount(), descriptor, call.getCallVideoProvider(),
                 parentCallId, childCallIds, call.getFeatures());
     }
 
