diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index f692627..9dc703a 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -579,14 +579,6 @@
         }
     }
 
-    /**
-     * Simulates a user click to hide the dialpad. This will update the UI to show the call card,
-     * update the checked state of the dialpad button, and update the proximity sensor state.
-     */
-    public void hideDialpadForDisconnect() {
-        mCallButtonFragment.displayDialpad(false /* show */, true /* animate */);
-    }
-
     public void dismissKeyguard(boolean dismiss) {
         if (mDismissKeyguard == dismiss) {
             return;
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 82ce58c..0343ed6 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -136,8 +136,7 @@
             new android.telecom.Call.Listener() {
         @Override
         public void onPostDialWait(android.telecom.Call call, String remainingPostDialSequence) {
-            onPostDialCharWait(
-                    CallList.getInstance().getCallByTelecommCall(call).getId(),
+            onPostDialCharWait(mCallList.getCallByTelecommCall(call).getId(),
                     remainingPostDialSequence);
         }
 
@@ -145,7 +144,7 @@
         public void onDetailsChanged(android.telecom.Call call,
                 android.telecom.Call.Details details) {
             for (InCallDetailsListener listener : mDetailsListeners) {
-                listener.onDetailsChanged(CallList.getInstance().getCallByTelecommCall(call),
+                listener.onDetailsChanged(mCallList.getCallByTelecommCall(call),
                         details);
             }
         }
@@ -155,7 +154,7 @@
                 android.telecom.Call call, List<android.telecom.Call> conferenceableCalls) {
             Log.i(this, "onConferenceableCallsChanged: " + call);
             for (InCallDetailsListener listener : mDetailsListeners) {
-                listener.onDetailsChanged(CallList.getInstance().getCallByTelecommCall(call),
+                listener.onDetailsChanged(mCallList.getCallByTelecommCall(call),
                         call.getDetails());
             }
         }
@@ -433,11 +432,10 @@
      */
     @Override
     public void onDisconnect(Call call) {
-        hideDialpadForDisconnect();
         maybeShowErrorDialogOnDisconnect(call);
 
         // We need to do the run the same code as onCallListChange.
-        onCallListChange(CallList.getInstance());
+        onCallListChange(mCallList);
 
         if (isActivityStarted()) {
             mInCallActivity.dismissKeyguard(false);
@@ -786,7 +784,7 @@
         /**
          * INCOMING CALL
          */
-        final CallList calls = CallList.getInstance();
+        final CallList calls = mCallList;
         final Call incomingCall = calls.getIncomingCall();
         Log.v(this, "incomingCall: " + incomingCall);
 
@@ -883,15 +881,6 @@
     }
 
     /**
-     * Hides the dialpad.  Called when a call is disconnected (Requires hiding dialpad).
-     */
-    private void hideDialpadForDisconnect() {
-        if (isActivityStarted()) {
-            mInCallActivity.hideDialpadForDisconnect();
-        }
-    }
-
-    /**
      * When the state of in-call changes, this is the first method to get called. It determines if
      * the UI needs to be started or finished depending on the new state and does it.
      */
@@ -963,7 +952,7 @@
         // machine. Telecom should also be the component responsible for disconnecting a call
         // with no valid accounts.
         showCallUi |= InCallState.PENDING_OUTGOING == newState && mainUiNotVisible
-                && isCallWithNoValidAccounts(CallList.getInstance().getPendingOutgoingCall());
+                && isCallWithNoValidAccounts(mCallList.getPendingOutgoingCall());
 
         // The only time that we have an instance of mInCallActivity and it isn't started is
         // when it is being destroyed.  In that case, lets avoid bringing up another instance of
@@ -1318,7 +1307,7 @@
      */
     public void setThemeColors() {
         // This method will set the background to default if the color is PhoneAccount.NO_COLOR.
-        mThemeColors = getColorsFromCall(CallList.getInstance().getFirstCall());
+        mThemeColors = getColorsFromCall(mCallList.getFirstCall());
 
         if (mInCallActivity == null) {
             return;
