diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 6d6ba5d..6a292c5 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -120,6 +120,17 @@
                 ConnectionService.VideoCallProvider videoCallProvider) {
             setVideoCallProvider(videoCallProvider);
         }
+
+        /**
+         * Used by the {@link com.android.internal.telephony.Connection} to report a change in the
+         * audio quality for the current call.
+         *
+         * @param audioQuality The audio quality.
+         */
+        @Override
+        public void onAudioQualityChanged(int audioQuality) {
+            setAudioQuality(audioQuality);
+        }
     };
 
     private com.android.internal.telephony.Connection mOriginalConnection;
@@ -127,7 +138,7 @@
 
     /**
      * Determines if the {@link TelephonyConnection} has local video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities(boolean)}} is called,
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
      * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
      * can be rebuilt at any time it is necessary to track the video capabilities between rebuild.
      * The {@link CallCapabilities} (including video capabilities) are communicated to the telecomm
@@ -137,7 +148,7 @@
 
     /**
      * Determines if the {@link TelephonyConnection} has remote video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities(boolean)}} is called,
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
      * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
      * can be rebuilt at any time it is necessary to track the video capabilities between rebuild.
      * The {@link CallCapabilities} (including video capabilities) are communicated to the telecomm
@@ -145,6 +156,13 @@
      */
     private boolean mRemoteVideoCapable;
 
+    /**
+     * Determines the current audio quality for the {@link TelephonyConnection}.
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called to indicate
+     * whether a call has the {@link android.telecomm.CallCapabilities#VoLTE} capability.
+     */
+    private int mAudioQuality;
+
     protected TelephonyConnection(com.android.internal.telephony.Connection originalConnection) {
         Log.v(this, "new TelephonyConnection, originalConnection: " + originalConnection);
         mOriginalConnection = originalConnection;
@@ -159,6 +177,7 @@
         setLocalVideoCapable(mOriginalConnection.isLocalVideoCapable());
         setRemoteVideoCapable(mOriginalConnection.isRemoteVideoCapable());
         setVideoCallProvider(mOriginalConnection.getVideoCallProvider());
+        setAudioQuality(mOriginalConnection.getAudioQuality());
 
         updateHandle();
     }
@@ -305,6 +324,7 @@
     protected final void updateCallCapabilities() {
         int newCallCapabilities = buildCallCapabilities();
         newCallCapabilities = applyVideoCapabilities(newCallCapabilities);
+        newCallCapabilities = applyAudioQualityCapabilities(newCallCapabilities);
 
         if (getCallCapabilities() != newCallCapabilities) {
             setCallCapabilities(newCallCapabilities);
@@ -464,20 +484,45 @@
     private int applyVideoCapabilities(int capabilities) {
         int currentCapabilities = capabilities;
         if (mRemoteVideoCapable) {
-            currentCapabilities |= CallCapabilities.SUPPORTS_VT_REMOTE;
+            currentCapabilities = applyCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_REMOTE);
         } else {
-            currentCapabilities &= ~CallCapabilities.SUPPORTS_VT_REMOTE;
+            currentCapabilities = removeCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_REMOTE);
         }
 
         if (mLocalVideoCapable) {
-            currentCapabilities |= CallCapabilities.SUPPORTS_VT_LOCAL;
+            currentCapabilities = applyCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_LOCAL);
         } else {
-            currentCapabilities &= ~CallCapabilities.SUPPORTS_VT_LOCAL;
+            currentCapabilities = removeCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_LOCAL);
         }
         return currentCapabilities;
     }
 
     /**
+     * Applies the audio capabilities to the {@code CallCapabilities} bit-mask.  A call with high
+     * definition audio is considered to have the {@code VoLTE} call capability as VoLTE uses high
+     * definition audio.
+     *
+     * @param callCapabilities The {@code CallCapabilities} bit-mask.
+     * @return The capabilities with the audio capabilities applied.
+     */
+    private int applyAudioQualityCapabilities(int callCapabilities) {
+        int currentCapabilities = callCapabilities;
+
+        if (mAudioQuality ==
+                com.android.internal.telephony.Connection.AUDIO_QUALITY_HIGH_DEFINITION) {
+            currentCapabilities = applyCapability(currentCapabilities, CallCapabilities.VoLTE);
+        } else {
+            currentCapabilities = removeCapability(currentCapabilities, CallCapabilities.VoLTE);
+        }
+
+        return currentCapabilities;
+    }
+
+    /**
      * Returns the local video capability state for the connection.
      *
      * @return {@code True} if the connection has local video capabilities.
@@ -517,6 +562,17 @@
         updateCallCapabilities();
     }
 
+    /**
+     * Sets the current call audio quality.  Used during rebuild of the
+     * {@link CallCapabilities} to set or unset the {@link CallCapabilities#VoLTE} capability.
+     *
+     * @param audioQuality The audio quality.
+     */
+    public void setAudioQuality(int audioQuality) {
+        mAudioQuality = audioQuality;
+        updateCallCapabilities();
+    }
+
     private static Uri getHandleFromAddress(String address) {
         // Address can be null for blocked calls.
         if (address == null) {
@@ -524,4 +580,28 @@
         }
         return Uri.fromParts(TelephonyConnectionService.SCHEME_TEL, address, null);
     }
+
+    /**
+     * Applies a capability to a capabilities bit-mask.
+     *
+     * @param capabilities The capabilities bit-mask.
+     * @param capability The capability to apply.
+     * @return The capabilities bit-mask with the capability applied.
+     */
+    private int applyCapability(int capabilities, int capability) {
+        int newCapabilities = capabilities | capability;
+        return newCapabilities;
+    }
+
+    /**
+     * Removes a capability from a capabilities bit-mask.
+     *
+     * @param capabilities The capabilities bit-mask.
+     * @param capability The capability to remove.
+     * @return The capabilities bit-mask with the capability removed.
+     */
+    private int removeCapability(int capabilities, int capability) {
+        int newCapabilities = capabilities & ~capability;
+        return newCapabilities;
+    }
 }
