diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index c1331cd..6f915a3 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -837,10 +837,6 @@
         mConnectionService.onPostDialContinue(this, proceed);
     }
 
-    void phoneAccountClicked() {
-        mConnectionService.onPhoneAccountClicked(this);
-    }
-
     void conferenceWith(Call otherCall) {
         if (mConnectionService == null) {
             Log.w(this, "conference requested on a call without a connection service.");
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 116cf95..bc953bd 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -574,14 +574,6 @@
         mProximitySensorManager.turnOff(screenOnImmediately);
     }
 
-    void phoneAccountClicked(Call call) {
-        if (!mCalls.contains(call)) {
-            Log.i(this, "phoneAccountClicked in a non-existent call %s", call);
-        } else {
-            call.phoneAccountClicked();
-        }
-    }
-
     void phoneAccountSelected(Call call, PhoneAccountHandle account) {
         if (!mCalls.contains(call)) {
             Log.i(this, "Attemped to add account to unknown call %s", call);
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index b37f185..98b624d 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -811,17 +811,6 @@
         }
     }
 
-    void onPhoneAccountClicked(Call call) {
-        final String callId = mCallIdMapper.getCallId(call);
-        if (callId != null && isServiceValid("onPhoneAccountClicked")) {
-            try {
-                logOutgoing("onPhoneAccountClicked %s", callId);
-                mServiceInterface.onPhoneAccountClicked(callId);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
     void conference(final Call call, Call otherCall) {
         final String callId = mCallIdMapper.getCallId(call);
         final String otherCallId = mCallIdMapper.getCallId(otherCall);
diff --git a/src/com/android/telecomm/InCallAdapter.java b/src/com/android/telecomm/InCallAdapter.java
index 60b574d..5217c81 100644
--- a/src/com/android/telecomm/InCallAdapter.java
+++ b/src/com/android/telecomm/InCallAdapter.java
@@ -37,17 +37,16 @@
     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_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;
-    private static final int MSG_SPLIT_FROM_CONFERENCE = 12;
-    private static final int MSG_SWAP_WITH_BACKGROUND_CALL = 13;
-    private static final int MSG_PHONE_ACCOUNT_SELECTED = 14;
-    private static final int MSG_TURN_ON_PROXIMITY_SENSOR = 15;
-    private static final int MSG_TURN_OFF_PROXIMITY_SENSOR = 16;
-    private static final int MSG_MERGE_CONFERENCE = 17;
-    private static final int MSG_SWAP_CONFERENCE = 18;
+    private static final int MSG_MUTE = 8;
+    private static final int MSG_SET_AUDIO_ROUTE = 9;
+    private static final int MSG_CONFERENCE = 10;
+    private static final int MSG_SPLIT_FROM_CONFERENCE = 11;
+    private static final int MSG_SWAP_WITH_BACKGROUND_CALL = 12;
+    private static final int MSG_PHONE_ACCOUNT_SELECTED = 13;
+    private static final int MSG_TURN_ON_PROXIMITY_SENSOR = 14;
+    private static final int MSG_TURN_OFF_PROXIMITY_SENSOR = 15;
+    private static final int MSG_MERGE_CONFERENCE = 16;
+    private static final int MSG_SWAP_CONFERENCE = 17;
 
     private final class InCallAdapterHandler extends Handler {
         @Override
@@ -135,14 +134,6 @@
                         Log.w(this, "unholdCall, unknown call id: %s", msg.obj);
                     }
                     break;
-                case MSG_PHONE_ACCOUNT_CLICKED:
-                    call = mCallIdMapper.getCall(msg.obj);
-                    if (call != null) {
-                        mCallsManager.phoneAccountClicked(call);
-                    } else {
-                        Log.w(this, "phoneAccountClicked, unknown call id: %s", msg.obj);
-                    }
-                    break;
                 case MSG_PHONE_ACCOUNT_SELECTED: {
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
@@ -293,13 +284,6 @@
     }
 
     @Override
-    public void phoneAccountClicked(String callId) {
-        if (mCallIdMapper.isValidCallId(callId)) {
-            mHandler.obtainMessage(MSG_PHONE_ACCOUNT_CLICKED, callId).sendToTarget();
-        }
-    }
-
-    @Override
     public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle) {
         if (mCallIdMapper.isValidCallId(callId)) {
             SomeArgs args = SomeArgs.obtain();
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
index 725549f..fdb4285 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
@@ -165,7 +165,7 @@
         }
 
         @Override
-        public void onSetAudioState(AudioState state) {
+        public void onAudioStateChanged(AudioState state) {
             mRemote.setAudioState(state);
         }
 
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionService.java b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
index 26a65aa..e221285 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionService.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
@@ -217,7 +217,7 @@
         }
 
         @Override
-        public void onSetAudioState(AudioState state) { }
+        public void onAudioStateChanged(AudioState state) { }
 
         public void setTestVideoCallProvider(TestVideoProvider testVideoCallProvider) {
             mTestVideoCallProvider = testVideoCallProvider;
