diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 3e37f29..5258f88 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -95,6 +95,8 @@
     private final ArrayList<Listener> mListeners = new ArrayList<Listener>();
     private Connection mCdmaIncomingConnection;
     private Connection mCdmaOutgoingConnection;
+    // TODO(sail): Temporary flag to disable sending telephony updates when Telecomm is being used.
+    private boolean mShouldDisableUpdates;
 
     public CallModeler(CallStateMonitor callStateMonitor, CallManager callManager,
             CallGatewayManager callGatewayManager) {
@@ -105,6 +107,12 @@
         mCallStateMonitor.addListener(this);
     }
 
+    public void setShouldDisableUpdates(boolean shouldDisableUpdates) {
+        Log.i(TAG, "setShouldDisableUpdates " + mShouldDisableUpdates + " -> " +
+                shouldDisableUpdates);
+        mShouldDisableUpdates = shouldDisableUpdates;
+    }
+
     @Override
     public void handleMessage(Message msg) {
         switch(msg.what) {
@@ -271,7 +279,7 @@
                     final Call call = getCallFromMap(mCallMap, c, false);
                     if (call == null) {
                         Log.i(TAG, "Call no longer exists. Skipping onPostDialWait().");
-                    } else {
+                    } else if (!mShouldDisableUpdates) {
                         for (Listener mListener : mListeners) {
                             mListener.onPostDialAction(state, call.getCallId(),
                                     c.getRemainingPostDialString(), ch);
@@ -281,8 +289,10 @@
                 default:
                     // This is primarily to cause the DTMFTonePlayer to play local tones.
                     // Other listeners simply perform no-ops.
-                    for (Listener mListener : mListeners) {
-                        mListener.onPostDialAction(state, 0, "", ch);
+                    if (!mShouldDisableUpdates) {
+                        for (Listener mListener : mListeners) {
+                            mListener.onPostDialAction(state, 0, "", ch);
+                        }
                     }
                     break;
             }
@@ -296,8 +306,10 @@
         if (call != null) {
             updateCallFromConnection(call, conn, false);
 
-            for (int i = 0; i < mListeners.size(); ++i) {
-                mListeners.get(i).onIncoming(call);
+            if (!mShouldDisableUpdates) {
+                for (int i = 0; i < mListeners.size(); ++i) {
+                    mListeners.get(i).onIncoming(call);
+                }
             }
         }
 
@@ -314,8 +326,10 @@
 
             updateCallFromConnection(call, conn, false);
 
-            for (int i = 0; i < mListeners.size(); ++i) {
-                mListeners.get(i).onDisconnect(call);
+            if (!mShouldDisableUpdates) {
+                for (int i = 0; i < mListeners.size(); ++i) {
+                    mListeners.get(i).onDisconnect(call);
+                }
             }
 
             // If it was a conferenced call, we need to run the entire update
@@ -339,7 +353,7 @@
         final List<Call> updatedCalls = Lists.newArrayList();
         doUpdate(false, updatedCalls);
 
-        if (updatedCalls.size() > 0) {
+        if (updatedCalls.size() > 0 && !mShouldDisableUpdates) {
             for (int i = 0; i < mListeners.size(); ++i) {
                 mListeners.get(i).onUpdate(updatedCalls);
             }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 2059b64..d7b109d 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -600,7 +600,7 @@
     /**
      * Returns the singleton instance of the PhoneApp.
      */
-    static PhoneGlobals getInstance() {
+    public static PhoneGlobals getInstance() {
         if (sMe == null) {
             throw new IllegalStateException("No PhoneGlobals here!");
         }
@@ -642,7 +642,7 @@
         return audioRouter;
     }
 
-    /* package */ CallModeler getCallModeler() {
+    public CallModeler getCallModeler() {
         return callModeler;
     }
 
diff --git a/src/com/android/services/telephony/BaseTelephonyCallService.java b/src/com/android/services/telephony/BaseTelephonyCallService.java
index a1b1d7c..a9051c5 100644
--- a/src/com/android/services/telephony/BaseTelephonyCallService.java
+++ b/src/com/android/services/telephony/BaseTelephonyCallService.java
@@ -28,6 +28,8 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.Phone;
+import com.android.phone.PhoneGlobals;
+import com.android.phone.CallModeler;
 
 import java.util.HashMap;
 
@@ -49,6 +51,9 @@
      */
     static void onCallConnectionClosing(TelephonyCallConnection callConnection) {
         sCallConnections.remove(callConnection.getCallId());
+        if (sCallConnections.isEmpty()) {
+            PhoneGlobals.getInstance().getCallModeler().setShouldDisableUpdates(false);
+        }
     }
 
     /** {@inheritDoc} */
@@ -113,10 +118,14 @@
 
             Connection connection;
             try {
+                PhoneGlobals.getInstance().getCallModeler().setShouldDisableUpdates(true);
                 connection = phone.dial(number);
             } catch (CallStateException e) {
                 Log.e(TAG, "Call to Phone.dial failed with exception", e);
                 mCallServiceAdapter.handleFailedOutgoingCall(callInfo.getId(), e.getMessage());
+                if (sCallConnections.isEmpty()) {
+                    PhoneGlobals.getInstance().getCallModeler().setShouldDisableUpdates(false);
+                }
                 return;
             }
 
