diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 2810dc8..99e4b07 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -75,6 +75,7 @@
         void onCallVideoProviderChanged(Call call);
         void onFeaturesChanged(Call call);
         void onCallerInfoChanged(Call call);
+        void onAudioModeIsVoipChanged(Call call);
     }
 
     abstract static class ListenerBase implements Listener {
@@ -110,6 +111,8 @@
         public void onFeaturesChanged(Call call) {}
         @Override
         public void onCallerInfoChanged(Call call) {}
+        @Override
+        public void onAudioModeIsVoipChanged(Call call) {}
     }
 
     private static final OnQueryCompleteListener sCallerInfoQueryListener =
@@ -228,6 +231,8 @@
     /** Features associated with the call which the InCall UI may wish to show icons for. */
     private int mFeatures;
 
+    private boolean mAudioModeIsVoip;
+
     /**
      * Creates an empty call object.
      *
@@ -1058,4 +1063,15 @@
     public void setVideoState(int videoState) {
         mVideoState = videoState;
     }
+
+    public boolean getAudioModeIsVoip() {
+        return mAudioModeIsVoip;
+    }
+
+    public void setAudioModeIsVoip(boolean audioModeIsVoip) {
+        mAudioModeIsVoip = audioModeIsVoip;
+        for (Listener l : mListeners) {
+            l.onAudioModeIsVoipChanged(Call.this);
+        }
+    }
 }
diff --git a/src/com/android/telecomm/CallAudioManager.java b/src/com/android/telecomm/CallAudioManager.java
index 35de0cc..8156db0 100644
--- a/src/com/android/telecomm/CallAudioManager.java
+++ b/src/com/android/telecomm/CallAudioManager.java
@@ -102,6 +102,11 @@
         updateAudioForForegroundCall();
     }
 
+    @Override
+    public void onAudioModeIsVoipChanged(Call call) {
+        updateAudioStreamAndMode();
+    }
+
     void toggleMute() {
         mute(!mAudioState.isMuted);
     }
@@ -277,8 +282,8 @@
         } else {
             Call call = getForegroundCall();
             if (call != null) {
-                int mode = TelephonyUtil.isCurrentlyPSTNCall(call) ?
-                        AudioManager.MODE_IN_CALL : AudioManager.MODE_IN_COMMUNICATION;
+                int mode = call.getAudioModeIsVoip() ?
+                        AudioManager.MODE_IN_COMMUNICATION : AudioManager.MODE_IN_CALL;
                 requestAudioFocusAndSetMode(AudioManager.STREAM_VOICE_CALL, mode);
             } else if (mIsTonePlaying) {
                 // There is no call, however, we are still playing a tone, so keep focus.
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 3884adb..d451162 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -61,6 +61,7 @@
         void onCannedSmsResponsesLoaded(Call call);
         void onCallVideoProviderChanged(Call call);
         void onFeaturesChanged(Call call);
+        void onAudioModeIsVoipChanged(Call call);
     }
 
     private static final CallsManager INSTANCE = new CallsManager();
@@ -226,6 +227,13 @@
         }
     }
 
+    @Override
+    public void onAudioModeIsVoipChanged(Call call) {
+        for (CallsManagerListener listener : mListeners) {
+            listener.onAudioModeIsVoipChanged(call);
+        }
+    }
+
     ImmutableCollection<Call> getCalls() {
         return ImmutableList.copyOf(mCalls);
     }
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index f34bdad..b6eb3b9 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -83,4 +83,8 @@
     @Override
     public void onFeaturesChanged(Call call) {
     }
+
+    @Override
+    public void onAudioModeIsVoipChanged(Call call) {
+    }
 }
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index f53eeb3..1bad6fd 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -76,6 +76,7 @@
     private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 16;
     private static final int MSG_SET_CALL_VIDEO_PROVIDER = 17;
     private static final int MSG_SET_FEATURES = 18;
+    private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 19;
 
     private final Handler mHandler = new Handler() {
         @Override
@@ -288,7 +289,7 @@
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
                         call = mCallIdMapper.getCall(args.arg1);
-                        int features = (int) args.arg2;
+                        int features = (int) args.argi1;
                         if (call != null) {
                             call.setFeatures(features);
                         }
@@ -297,6 +298,19 @@
                     }
                     break;
                 }
+                case MSG_SET_AUDIO_MODE_IS_VOIP: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        call = mCallIdMapper.getCall(args.arg1);
+                        boolean isVoip = args.argi1 == 1;
+                        if (call != null) {
+                            call.setAudioModeIsVoip(isVoip);
+                        }
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
             }
         }
     };
@@ -463,9 +477,19 @@
             mCallIdMapper.checkValidCallId(callId);
             SomeArgs args = SomeArgs.obtain();
             args.arg1 = callId;
-            args.arg2 = features;
+            args.argi1 = features;
             mHandler.obtainMessage(MSG_SET_FEATURES, args).sendToTarget();
         }
+
+        @Override
+        public void setAudioModeIsVoip(String callId, boolean isVoip) {
+            logIncoming("setAudioModeIsVoip %s %d", callId, isVoip);
+            mCallIdMapper.checkValidCallId(callId);
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = callId;
+            args.argi1 = isVoip ? 1 : 0;
+            mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, args).sendToTarget();
+        }
     }
 
     private final Adapter mAdapter = new Adapter();
