diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index 3003290..bbffbd2 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -333,9 +333,6 @@
                     int toneToPlay = InCallTonePlayer.TONE_VOICE_PRIVACY;
                     new InCallTonePlayer(toneToPlay).start();
                     mVoicePrivacyState = true;
-                    // Update the VP icon:
-                    if (DBG) log("- updating notification for VP state...");
-                    mApplication.notificationMgr.updateInCallNotification();
                 }
                 break;
 
@@ -345,9 +342,6 @@
                     int toneToPlay = InCallTonePlayer.TONE_VOICE_PRIVACY;
                     new InCallTonePlayer(toneToPlay).start();
                     mVoicePrivacyState = false;
-                    // Update the VP icon:
-                    if (DBG) log("- updating notification for VP state...");
-                    mApplication.notificationMgr.updateInCallNotification();
                 }
                 break;
 
@@ -359,10 +353,6 @@
                 onResendMute();
                 break;
 
-            case UPDATE_IN_CALL_NOTIFICATION:
-                mApplication.notificationMgr.updateInCallNotification();
-                break;
-
             default:
                 // super.handleMessage(msg);
         }
@@ -456,6 +446,7 @@
                 mCallWaitingTonePlayer = new InCallTonePlayer(InCallTonePlayer.TONE_CALL_WAITING);
                 mCallWaitingTonePlayer.start();
             }
+
             // in this case, just fall through like before, and call
             // showIncomingCall().
             if (DBG) log("- showing incoming call (this is a WAITING call)...");
@@ -679,55 +670,13 @@
         if (state == PhoneConstants.State.OFFHOOK) {
             // basically do onPhoneStateChanged + display the incoming call UI
             onPhoneStateChanged(r);
+
             if (DBG) log("- showing incoming call (unknown connection appeared)...");
             final Connection c = (Connection) r.result;
             notifyCallModelerOfNewRingingCall(c);
         }
     }
 
-    /**
-     * Informs the user about a new incoming call.
-     *
-     * In most cases this means "bring up the full-screen incoming call
-     * UI".  However, if an immersive activity is running, the system
-     * NotificationManager will instead pop up a small notification window
-     * on top of the activity.
-     *
-     * Watch out: be sure to call this method only once per incoming call,
-     * or otherwise we may end up launching the InCallScreen multiple
-     * times (which can lead to slow responsiveness and/or visible
-     * glitches.)
-     *
-     * Note this method handles only the onscreen UI for incoming calls;
-     * the ringer and/or vibrator are started separately (see the various
-     * calls to Ringer.ring() in this class.)
-     *
-     * @see NotificationMgr#updateNotificationAndLaunchIncomingCallUi()
-     */
-    private void showIncomingCall() {
-        log("showIncomingCall()...  phone state = " + mCM.getState());
-
-        // Before bringing up the "incoming call" UI, force any system
-        // dialogs (like "recent tasks" or the power dialog) to close first.
-        try {
-            ActivityManagerNative.getDefault().closeSystemDialogs("call");
-        } catch (RemoteException e) {
-        }
-
-        // Go directly to the in-call screen.
-        // (No need to do anything special if we're already on the in-call
-        // screen; it'll notice the phone state change and update itself.)
-        mApplication.requestWakeState(PhoneGlobals.WakeState.FULL);
-
-        // Post the "incoming call" notification *and* include the
-        // fullScreenIntent that'll launch the incoming-call UI.
-        // (This will usually take us straight to the incoming call
-        // screen, but if an immersive activity is running it'll just
-        // appear as a notification.)
-        if (DBG) log("- updating notification from showIncomingCall()...");
-        mApplication.notificationMgr.updateNotificationAndLaunchIncomingCallUi();
-    }
-
     private void notifyCallModelerOfNewRingingCall(Connection c) {
         mCallModeler.onNewRingingConnection(c);
     }
@@ -803,26 +752,6 @@
             // remove it!
             if (DBG) log("stopRing()... (OFFHOOK state)");
             mRinger.stopRing();
-
-            // Post a request to update the "in-call" status bar icon.
-            //
-            // We don't call NotificationMgr.updateInCallNotification()
-            // directly here, for two reasons:
-            // (1) a single phone state change might actually trigger multiple
-            //   onPhoneStateChanged() callbacks, so this prevents redundant
-            //   updates of the notification.
-            // (2) we suppress the status bar icon while the in-call UI is
-            //   visible (see updateInCallNotification()).  But when launching
-            //   an outgoing call the phone actually goes OFFHOOK slightly
-            //   *before* the InCallScreen comes up, so the delay here avoids a
-            //   brief flicker of the icon at that point.
-
-            if (DBG) log("- posting UPDATE_IN_CALL_NOTIFICATION request...");
-            // Remove any previous requests in the queue
-            removeMessages(UPDATE_IN_CALL_NOTIFICATION);
-            final int IN_CALL_NOTIFICATION_UPDATE_DELAY = 1000;  // msec
-            sendEmptyMessageDelayed(UPDATE_IN_CALL_NOTIFICATION,
-                                    IN_CALL_NOTIFICATION_UPDATE_DELAY);
         }
 
         if (fgPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
@@ -1665,13 +1594,6 @@
         mApplication.cdmaPhoneCallState.setCurrentCallState(
                 CdmaPhoneCallState.PhoneCallState.SINGLE_ACTIVE);
 
-        // Display the incoming call to the user if the InCallScreen isn't
-        // already in the foreground.
-        if (!mApplication.isShowingCallScreen()) {
-            if (DBG) log("- showing incoming call (CDMA call waiting)...");
-            showIncomingCall();
-        }
-
         // Start timer for CW display
         mCallWaitingTimeOut = false;
         sendEmptyMessageDelayed(CALLWAITING_CALLERINFO_DISPLAY_DONE,
diff --git a/src/com/android/phone/InCallScreen.java b/src/com/android/phone/InCallScreen.java
index 4073bbb..53cd40d 100644
--- a/src/com/android/phone/InCallScreen.java
+++ b/src/com/android/phone/InCallScreen.java
@@ -494,10 +494,6 @@
 
         updateExpandedViewState();
 
-        // ...and update the in-call notification too, since the status bar
-        // icon needs to be hidden while we're the foreground activity:
-        mApp.notificationMgr.updateInCallNotification();
-
         // Listen for broadcast intents that might affect the onscreen UI.
         registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
 
@@ -760,8 +756,6 @@
 
         updateExpandedViewState();
 
-        // ...and the in-call notification too:
-        mApp.notificationMgr.updateInCallNotification();
         // ...and *always* reset the system bar back to its normal state
         // when leaving the in-call UI.
         // (While we're the foreground activity, we disable navigation in
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 5c33ab4..7771fa9 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -67,7 +67,7 @@
  *
  * @see PhoneGlobals.notificationMgr
  */
-public class NotificationMgr implements CallerInfoAsyncQuery.OnQueryCompleteListener{
+public class NotificationMgr {
     private static final String LOG_TAG = "NotificationMgr";
     private static final boolean DBG =
             (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
@@ -112,8 +112,6 @@
     // used to track the missed call counter, default to 0.
     private int mNumberMissedCalls = 0;
 
-    private boolean mHasInCallNotification = false;
-
     // used to track the notification of selected network unavailable
     private boolean mSelectedUnavailableNotify = false;
 
@@ -278,10 +276,6 @@
         mQueryHandler.startQuery(CALL_LOG_TOKEN, null, Calls.CONTENT_URI,  CALL_LOG_PROJECTION,
                 where.toString(), null, Calls.DEFAULT_SORT_ORDER);
 
-        // Update (or cancel) the in-call notification
-        if (DBG) log("- updating in-call notification at startup...");
-        updateInCallNotification();
-
         // Depend on android.app.StatusBarManager to be set to
         // disable(DISABLE_NONE) upon startup.  This will be the
         // case even if the phone app crashes.
@@ -705,229 +699,11 @@
     }
 
     /**
-     * Updates the phone app's status bar notification based on the
-     * current telephony state, or cancels the notification if the phone
-     * is totally idle.
-     *
-     * This method will never actually launch the incoming-call UI.
-     * (Use updateNotificationAndLaunchIncomingCallUi() for that.)
-     */
-    public void updateInCallNotification() {
-        // allowFullScreenIntent=false means *don't* allow the incoming
-        // call UI to be launched.
-        updateInCallNotification(false);
-    }
-
-    /**
-     * Updates the phone app's status bar notification *and* launches the
-     * incoming call UI in response to a new incoming call.
-     *
-     * This is just like updateInCallNotification(), with one exception:
-     * If an incoming call is ringing (or call-waiting), the notification
-     * will also include a "fullScreenIntent" that will cause the
-     * InCallScreen to be launched immediately, unless the current
-     * foreground activity is marked as "immersive".
-     *
-     * (This is the mechanism that actually brings up the incoming call UI
-     * when we receive a "new ringing connection" event from the telephony
-     * layer.)
-     *
-     * Watch out: this method should ONLY be called directly from the code
-     * path in CallNotifier that handles the "new ringing connection"
-     * event from the telephony layer.  All other places that update the
-     * in-call notification (like for phone state changes) should call
-     * updateInCallNotification() instead.  (This ensures that we don't
-     * end up launching the InCallScreen multiple times for a single
-     * incoming call, which could cause slow responsiveness and/or visible
-     * glitches.)
-     *
-     * Also note that this method is safe to call even if the phone isn't
-     * actually ringing (or, more likely, if an incoming call *was*
-     * ringing briefly but then disconnected).  In that case, we'll simply
-     * update or cancel the in-call notification based on the current
-     * phone state.
-     *
-     * @see #updateInCallNotification(boolean)
-     */
-    public void updateNotificationAndLaunchIncomingCallUi() {
-        // Set allowFullScreenIntent=true to indicate that we *should*
-        // launch the incoming call UI if necessary.
-        updateInCallNotification(true);
-    }
-
-    /**
-     * Helper method for updateInCallNotification() and
-     * updateNotificationAndLaunchIncomingCallUi(): Update the phone app's
-     * status bar notification based on the current telephony state, or
-     * cancels the notification if the phone is totally idle.
-     *
-     * @param allowFullScreenIntent If true, *and* an incoming call is
-     *   ringing, the notification will include a "fullScreenIntent"
-     *   pointing at the InCallScreen (which will cause the InCallScreen
-     *   to be launched.)
-     *   Watch out: This should be set to true *only* when directly
-     *   handling the "new ringing connection" event from the telephony
-     *   layer (see updateNotificationAndLaunchIncomingCallUi().)
-     */
-    private void updateInCallNotification(boolean allowFullScreenIntent) {
-        if (DBG) log("updateInCallNotification(allowFullScreenIntent = "
-                     + allowFullScreenIntent + ")...");
-
-        // Never display the "ongoing call" notification on
-        // non-voice-capable devices, even if the phone is actually
-        // offhook (like during a non-interactive OTASP call.)
-        if (!PhoneGlobals.sVoiceCapable) {
-            if (DBG) log("- non-voice-capable device; suppressing notification.");
-            return;
-        }
-
-        // If the phone is idle, completely clean up all call-related
-        // notifications.
-        if (mCM.getState() == PhoneConstants.State.IDLE) {
-            cancelInCall();
-            cancelMute();
-            cancelSpeakerphone();
-            return;
-        }
-
-        final boolean hasRingingCall = mCM.hasActiveRingingCall();
-        if (DBG) {
-            log("  - hasRingingCall = " + hasRingingCall);
-        }
-
-        // Suppress the in-call notification if the InCallScreen is the
-        // foreground activity, since it's already obvious that you're on a
-        // call.  (The status bar icon is needed only if you navigate *away*
-        // from the in-call UI.)
-        boolean suppressNotification = mApp.isShowingCallScreen();
-        // if (DBG) log("- suppressNotification: initial value: " + suppressNotification);
-
-        // ...except for a couple of cases where we *never* suppress the
-        // notification:
-        //
-        //   - If there's an incoming ringing call: always show the
-        //     notification, since the in-call notification is what actually
-        //     launches the incoming call UI in the first place (see
-        //     notification.fullScreenIntent below.)  This makes sure that we'll
-        //     correctly handle the case where a new incoming call comes in but
-        //     the InCallScreen is already in the foreground.
-        if (hasRingingCall) suppressNotification = false;
-
-        //   - If "voice privacy" mode is active: always show the notification,
-        //     since that's the only "voice privacy" indication we have.
-        boolean enhancedVoicePrivacy = mApp.notifier.getVoicePrivacyState();
-        // if (DBG) log("updateInCallNotification: enhancedVoicePrivacy = " + enhancedVoicePrivacy);
-        if (enhancedVoicePrivacy) suppressNotification = false;
-
-        if (suppressNotification) {
-            if (DBG) log("- suppressNotification = true; reducing clutter in status bar...");
-            cancelInCall();
-            // Suppress the mute and speaker status bar icons too
-            // (also to reduce clutter in the status bar.)
-            cancelSpeakerphone();
-            cancelMute();
-            return;
-        }
-
-        mHasInCallNotification = true;
-
-        // Activate a couple of special Notification features if an
-        // incoming call is ringing:
-        if (hasRingingCall) {
-            if (DBG) log("- Using hi-pri notification for ringing call!");
-
-            if (allowFullScreenIntent) {
-
-                // Ugly hack alert:
-                //
-                // The NotificationManager has the (undocumented) behavior
-                // that it will *ignore* the fullScreenIntent field if you
-                // post a new Notification that matches the ID of one that's
-                // already active.  Unfortunately this is exactly what happens
-                // when you get an incoming call-waiting call:  the
-                // "ongoing call" notification is already visible, so the
-                // InCallScreen won't get launched in this case!
-                // (The result: if you bail out of the in-call UI while on a
-                // call and then get a call-waiting call, the incoming call UI
-                // won't come up automatically.)
-                //
-                // The workaround is to just notice this exact case (this is a
-                // call-waiting call *and* the InCallScreen is not in the
-                // foreground) and manually cancel the in-call notification
-                // before (re)posting it.
-                //
-                // TODO: there should be a cleaner way of avoiding this
-                // problem (see discussion in bug 3184149.)
-                Call ringingCall = mCM.getFirstActiveRingingCall();
-                if ((ringingCall.getState() == Call.State.WAITING) && !mApp.isShowingCallScreen()) {
-                    Log.i(LOG_TAG, "updateInCallNotification: call-waiting! force relaunch...");
-                    // Cancel the IN_CALL_NOTIFICATION immediately before
-                    // (re)posting it; this seems to force the
-                    // NotificationManager to launch the fullScreenIntent.
-                    mNotificationManager.cancel(IN_CALL_NOTIFICATION);
-                }
-            }
-        }
-
-        // Finally, refresh the mute and speakerphone notifications (since
-        // some phone state changes can indirectly affect the mute and/or
-        // speaker state).
-        updateSpeakerNotification();
-        updateMuteNotification();
-    }
-
-    /**
-     * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface.
-     * refreshes the contentView when called.
-     */
-    @Override
-    public void onQueryComplete(int token, Object cookie, CallerInfo ci){
-        if (DBG) log("CallerInfo query complete (for NotificationMgr), "
-                     + "updating in-call notification..");
-        if (DBG) log("- cookie: " + cookie);
-        if (DBG) log("- ci: " + ci);
-
-        if (cookie == this) {
-            // Ok, this is the caller-id query we fired off in
-            // updateInCallNotification(), presumably when an incoming call
-            // first appeared.  If the caller-id info matched any contacts,
-            // compactName should now be a real person name rather than a raw
-            // phone number:
-            if (DBG) log("- compactName is now: "
-                         + PhoneUtils.getCompactNameFromCallerInfo(ci, mContext));
-
-            // Now that our CallerInfo object has been fully filled-in,
-            // refresh the in-call notification.
-            if (DBG) log("- updating notification after query complete...");
-            updateInCallNotification();
-        } else {
-            Log.w(LOG_TAG, "onQueryComplete: caller-id query from unknown source! "
-                  + "cookie = " + cookie);
-        }
-    }
-
-    /**
-     * Take down the in-call notification.
-     * @see updateInCallNotification()
-     */
-    private void cancelInCall() {
-        if (DBG) log("cancelInCall()...");
-        mNotificationManager.cancel(IN_CALL_NOTIFICATION);
-        mHasInCallNotification = false;
-    }
-
-    /**
      * Completely take down the in-call notification *and* the mute/speaker
      * notifications as well, to indicate that the phone is now idle.
      */
     /* package */ void cancelCallInProgressNotifications() {
-        if (DBG) log("cancelCallInProgressNotifications()...");
-        if (!mHasInCallNotification) {
-            return;
-        }
-
         if (DBG) log("cancelCallInProgressNotifications");
-        cancelInCall();
         cancelMute();
         cancelSpeakerphone();
     }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 49a3427..b70b159 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -105,7 +105,6 @@
     // Message codes; see mHandler below.
     private static final int EVENT_SIM_NETWORK_LOCKED = 3;
     private static final int EVENT_SIM_STATE_CHANGED = 8;
-    private static final int EVENT_UPDATE_INCALL_NOTIFICATION = 9;
     private static final int EVENT_DATA_ROAMING_DISCONNECTED = 10;
     private static final int EVENT_DATA_ROAMING_OK = 11;
     private static final int EVENT_UNSOL_CDMA_INFO_RECORD = 12;
@@ -301,16 +300,6 @@
                     }
                     break;
 
-                case EVENT_UPDATE_INCALL_NOTIFICATION:
-                    // Tell the NotificationMgr to update the "ongoing
-                    // call" icon in the status bar, if necessary.
-                    // Currently, this is triggered by a bluetooth headset
-                    // state change (since the status bar icon needs to
-                    // turn blue when bluetooth is active.)
-                    if (DBG) Log.d (LOG_TAG, "- updating in-call notification from handler...");
-                    notificationMgr.updateInCallNotification();
-                    break;
-
                 case EVENT_DATA_ROAMING_DISCONNECTED:
                     notificationMgr.showDataDisconnectedRoaming();
                     break;
