diff --git a/src/com/android/phone/BluetoothManager.java b/src/com/android/phone/BluetoothManager.java
index dd38632..c2b4f7d 100644
--- a/src/com/android/phone/BluetoothManager.java
+++ b/src/com/android/phone/BluetoothManager.java
@@ -27,8 +27,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.os.Handler;
-import android.os.Message;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.util.Log;
@@ -36,7 +34,6 @@
 import com.android.internal.telephony.CallManager;
 import com.android.services.telephony.common.Call;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -419,6 +416,11 @@
         updateBluetoothIndication();
     }
 
+    @Override
+    public void onPostDialWait(int callId, String chars) {
+        // no-op
+    }
+
     private void log(String msg) {
         Log.d(LOG_TAG, msg);
     }
diff --git a/src/com/android/phone/CallCommandService.java b/src/com/android/phone/CallCommandService.java
index 72273ee..aaa3190 100644
--- a/src/com/android/phone/CallCommandService.java
+++ b/src/com/android/phone/CallCommandService.java
@@ -220,4 +220,20 @@
             Log.e(TAG, "Error setting the audio mode.", e);
         }
     }
+
+    @Override
+    public void postDialCancel(int callId) throws RemoteException {
+        final CallResult result = mCallModeler.getCallWithId(callId);
+        if (result != null) {
+            result.getConnection().cancelPostDial();
+        }
+    }
+
+    @Override
+    public void postDialWaitContinue(int callId) throws RemoteException {
+        final CallResult result = mCallModeler.getCallWithId(callId);
+        if (result != null) {
+            result.getConnection().proceedAfterWaitChar();
+        }
+    }
 }
diff --git a/src/com/android/phone/CallHandlerServiceProxy.java b/src/com/android/phone/CallHandlerServiceProxy.java
index a57ac5b..4820b33 100644
--- a/src/com/android/phone/CallHandlerServiceProxy.java
+++ b/src/com/android/phone/CallHandlerServiceProxy.java
@@ -192,6 +192,26 @@
         }
     }
 
+
+    @Override
+    public void onPostDialWait(int callId, String remainingChars) {
+        try {
+            synchronized (mServiceAndQueueLock) {
+                if (mCallHandlerServiceGuarded == null) {
+                    if (DBG) {
+                        Log.d(TAG, "CallHandlerService not conneccted. Skipping "
+                                + "onPostDialWait().");
+                    }
+                    return;
+                }
+            }
+
+            mCallHandlerServiceGuarded.onPostDialWait(callId, remainingChars);
+        } catch (Exception e) {
+            Log.e(TAG, "Remote exception handling onUpdate", e);
+        }
+    }
+
     @Override
     public void onAudioModeChange(int newMode, boolean muted) {
         try {
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 9c7b9dd..502f2cb 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -16,7 +16,6 @@
 
 package com.android.phone;
 
-import android.content.Context;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -114,6 +113,9 @@
             case CallStateMonitor.PHONE_STATE_CHANGED:
                 onPhoneStateChanged((AsyncResult) msg.obj);
                 break;
+            case CallStateMonitor.PHONE_ON_DIAL_CHARS:
+                onPostDialChars((AsyncResult) msg.obj, (char) msg.arg1);
+                break;
             default:
                 break;
         }
@@ -192,6 +194,41 @@
         return false;
     }
 
+
+    /**
+     * Handles the POST_ON_DIAL_CHARS message from the Phone (see our call to
+     * mPhone.setOnPostDialCharacter() above.)
+     *
+     * TODO: NEED TO TEST THIS SEQUENCE now that we no longer handle "dialable" key events here in
+     * the InCallScreen: we do directly to the Dialer UI instead.  Similarly, we may now need to go
+     * directly to the Dialer to handle POST_ON_DIAL_CHARS too.
+     */
+    private void onPostDialChars(AsyncResult r, char ch) {
+        final Connection c = (Connection) r.result;
+
+        if (c != null) {
+            final Connection.PostDialState state = (Connection.PostDialState) r.userObj;
+
+            switch (state) {
+                // TODO(klp): add other post dial related functions
+                case WAIT:
+                    final Call call = getCallFromMap(mCallMap, c, false);
+                    if (call == null) {
+                        Log.i(TAG, "Call no longer exists. Skipping onPostDialWait().");
+                    } else {
+                        for (Listener mListener : mListeners) {
+                            mListener.onPostDialWait(call.getCallId(),
+                                    c.getRemainingPostDialString());
+                        }
+                    }
+                    break;
+
+                default:
+                    break;
+            }
+        }
+    }
+
     private void onNewRingingConnection(AsyncResult r) {
         Log.i(TAG, "onNewRingingConnection");
         final Connection conn = (Connection) r.result;
@@ -686,6 +723,7 @@
         void onDisconnect(Call call);
         void onIncoming(Call call);
         void onUpdate(List<Call> calls);
+        void onPostDialWait(int callId, String remainingChars);
     }
 
     /**
diff --git a/src/com/android/phone/CallStateMonitor.java b/src/com/android/phone/CallStateMonitor.java
index 6152277..3e9ff5d 100644
--- a/src/com/android/phone/CallStateMonitor.java
+++ b/src/com/android/phone/CallStateMonitor.java
@@ -56,6 +56,7 @@
     public static final int PHONE_ENHANCED_VP_OFF = 10;
     public static final int PHONE_RINGBACK_TONE = 11;
     public static final int PHONE_RESEND_MUTE = 12;
+    public static final int PHONE_ON_DIAL_CHARS = 13;
 
     // Other events from call manager
     public static final int EVENT_OTA_PROVISION_CHANGE = 20;
@@ -88,6 +89,7 @@
         callManager.registerForInCallVoicePrivacyOff(this, PHONE_ENHANCED_VP_OFF, null);
         callManager.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);
         callManager.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);
+        callManager.registerForPostDialCharacter(this, PHONE_ON_DIAL_CHARS, null);
     }
 
     public void addListener(Handler handler) {
@@ -131,6 +133,7 @@
         callManager.unregisterForResendIncallMute(this);
         callManager.unregisterForInCallVoicePrivacyOn(this);
         callManager.unregisterForInCallVoicePrivacyOff(this);
+        callManager.unregisterForPostDialCharacter(this);
 
         registerForNotifications();
     }
diff --git a/src/com/android/phone/DTMFTonePlayer.java b/src/com/android/phone/DTMFTonePlayer.java
index d3ed53e..0acd114 100644
--- a/src/com/android/phone/DTMFTonePlayer.java
+++ b/src/com/android/phone/DTMFTonePlayer.java
@@ -31,8 +31,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.services.telephony.common.Call;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -125,6 +123,11 @@
         checkCallState();
     }
 
+    @Override
+    public void onPostDialWait(int callId, String chars) {
+        // no-op
+    }
+
     /**
      * Allocates some resources we keep around during a "dialer session".
      *
