diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index bc9bf63..ae40087 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -25,10 +25,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
 import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.AsyncResult;
@@ -36,7 +33,7 @@
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.SystemProperties;
-import android.telecomm.VideoCallProfile;
+import android.telecomm.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.Log;
@@ -56,10 +53,8 @@
 import com.android.internal.telephony.MmiCode;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyCapabilities;
 import com.android.internal.telephony.TelephonyProperties;
-import com.android.internal.telephony.cdma.CdmaConnection;
 import com.android.internal.telephony.sip.SipPhone;
 import com.android.phone.CallGatewayManager.RawGatewayInfo;
 
@@ -643,7 +638,7 @@
         final boolean initiallyIdle = app.mCM.getState() == PhoneConstants.State.IDLE;
 
         try {
-            connection = app.mCM.dial(phone, numberToDial, VideoCallProfile.VideoState.AUDIO_ONLY);
+            connection = app.mCM.dial(phone, numberToDial, VideoProfile.VideoState.AUDIO_ONLY);
         } catch (CallStateException ex) {
             // CallStateException means a new outgoing call is not currently
             // possible: either no more call slots exist, or there's another
diff --git a/src/com/android/services/telephony/CdmaConnection.java b/src/com/android/services/telephony/CdmaConnection.java
index 668308a..f13676a 100644
--- a/src/com/android/services/telephony/CdmaConnection.java
+++ b/src/com/android/services/telephony/CdmaConnection.java
@@ -16,7 +16,7 @@
 
 package com.android.services.telephony;
 
-import android.telecomm.CallCapabilities;
+import android.telecomm.PhoneCapabilities;
 
 import com.android.internal.telephony.Connection;
 
@@ -49,7 +49,7 @@
 
     @Override
     protected int buildCallCapabilities() {
-        int capabilities = CallCapabilities.MUTE;
+        int capabilities = PhoneCapabilities.MUTE;
         return capabilities;
     }
 }
diff --git a/src/com/android/services/telephony/GsmConferenceController.java b/src/com/android/services/telephony/GsmConferenceController.java
index 127a575..a69d1e6 100644
--- a/src/com/android/services/telephony/GsmConferenceController.java
+++ b/src/com/android/services/telephony/GsmConferenceController.java
@@ -16,15 +16,10 @@
 
 package com.android.services.telephony;
 
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.PhoneFactory;
-
 import java.util.ArrayList;
 
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import android.telecomm.Connection;
 
diff --git a/src/com/android/services/telephony/GsmConnection.java b/src/com/android/services/telephony/GsmConnection.java
index 298f3d9..5140574 100644
--- a/src/com/android/services/telephony/GsmConnection.java
+++ b/src/com/android/services/telephony/GsmConnection.java
@@ -16,7 +16,7 @@
 
 package com.android.services.telephony;
 
-import android.telecomm.CallCapabilities;
+import android.telecomm.PhoneCapabilities;
 
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
@@ -68,12 +68,12 @@
 
     @Override
     protected int buildCallCapabilities() {
-        int capabilities = CallCapabilities.MUTE | CallCapabilities.SUPPORT_HOLD;
-        if (getState() == State.ACTIVE || getState() == State.HOLDING) {
-            capabilities |= CallCapabilities.HOLD;
+        int capabilities = PhoneCapabilities.MUTE | PhoneCapabilities.SUPPORT_HOLD;
+        if (getState() == STATE_ACTIVE || getState() == STATE_HOLDING) {
+            capabilities |= PhoneCapabilities.HOLD;
         }
         if (mIsConferenceCapable) {
-            capabilities |= CallCapabilities.MERGE_CALLS;
+            capabilities |= PhoneCapabilities.MERGE_CALLS;
         }
         return capabilities;
     }
diff --git a/src/com/android/services/telephony/TelecommAccountRegistry.java b/src/com/android/services/telephony/TelecommAccountRegistry.java
index d40e9af..658d611 100644
--- a/src/com/android/services/telephony/TelecommAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecommAccountRegistry.java
@@ -89,15 +89,16 @@
             String description = isEmergency
                     ? "Emergency calling only"
                     : dummyPrefix + "SIM card in slot " + slotId;
-            PhoneAccount account = new PhoneAccount(
-                    phoneAccountHandle,
-                    Uri.fromParts(TEL_SCHEME, line1Number, null),
-                    subNumber,
-                    PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
-                            PhoneAccount.CAPABILITY_CALL_PROVIDER,
-                    com.android.phone.R.mipmap.ic_launcher_phone,
-                    label,
-                    description);
+            PhoneAccount account = PhoneAccount.builder()
+                    .withAccountHandle(phoneAccountHandle)
+                    .withHandle(Uri.fromParts(TEL_SCHEME, line1Number, null))
+                    .withSubscriptionNumber(subNumber)
+                    .withCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
+                            PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                    .withIconResId(com.android.phone.R.mipmap.ic_launcher_phone)
+                    .withLabel(label)
+                    .withShortDescription(description)
+                    .build();
 
             // Register with Telecomm and put into the account entry.
             mTelecommManager.registerPhoneAccount(account);
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 7bd43b2..7ddb6d0 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -20,18 +20,15 @@
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
-import android.telecomm.CallAudioState;
-import android.telecomm.CallCapabilities;
+import android.telecomm.AudioState;
+import android.telecomm.Connection;
+import android.telecomm.PhoneCapabilities;
 import android.telephony.DisconnectCause;
 
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection.PostDialListener;
 import com.android.internal.telephony.Phone;
-import com.android.phone.R;
-
-import android.telecomm.Connection;
-import android.telecomm.ConnectionService;
 
 import java.lang.Override;
 import java.util.List;
@@ -113,12 +110,11 @@
          * The {@link com.android.internal.telephony.Connection} has reported a change in the
          * video call provider.
          *
-         * @param videoCallProvider The video call provider.
+         * @param videoProvider The video call provider.
          */
         @Override
-        public void onVideoCallProviderChanged(
-                ConnectionService.VideoCallProvider videoCallProvider) {
-            setVideoCallProvider(videoCallProvider);
+        public void onVideoProviderChanged(VideoProvider videoProvider) {
+            setVideoProvider(videoProvider);
         }
 
         /**
@@ -138,20 +134,20 @@
 
     /**
      * Determines if the {@link TelephonyConnection} has local video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
-     * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
+     * This is used when {@link TelephonyConnection#updateCallCapabilities()}} is called,
+     * ensuring the appropriate {@link PhoneCapabilities} are set.  Since {@link PhoneCapabilities}
      * 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
+     * The {@link PhoneCapabilities} (including video capabilities) are communicated to the telecomm
      * layer.
      */
     private boolean mLocalVideoCapable;
 
     /**
      * Determines if the {@link TelephonyConnection} has remote video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
-     * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
+     * This is used when {@link TelephonyConnection#updateCallCapabilities()}} is called,
+     * ensuring the appropriate {@link PhoneCapabilities} are set.  Since {@link PhoneCapabilities}
      * 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
+     * The {@link PhoneCapabilities} (including video capabilities) are communicated to the telecomm
      * layer.
      */
     private boolean mRemoteVideoCapable;
@@ -170,7 +166,7 @@
     }
 
     @Override
-    public void onSetAudioState(CallAudioState audioState) {
+    public void onSetAudioState(AudioState audioState) {
         // TODO: update TTY mode.
         if (getPhone() != null) {
             getPhone().setEchoSuppressionEnabled();
@@ -292,11 +288,6 @@
     }
 
     @Override
-    public void onSwapWithBackgroundCall() {
-        Log.v(this, "onSwapWithBackgroundCall");
-    }
-
-    @Override
     public void onChildrenChanged(List<Connection> children) {
         Log.v(this, "onChildrenChanged, children: " + children);
     }
@@ -356,7 +347,7 @@
         setVideoState(mOriginalConnection.getVideoState());
         setLocalVideoCapable(mOriginalConnection.isLocalVideoCapable());
         setRemoteVideoCapable(mOriginalConnection.isRemoteVideoCapable());
-        setVideoCallProvider(mOriginalConnection.getVideoCallProvider());
+        setVideoProvider(mOriginalConnection.getVideoProvider());
         setAudioQuality(mOriginalConnection.getAudioQuality());
 
         updateHandle();
@@ -491,18 +482,18 @@
         int currentCapabilities = capabilities;
         if (mRemoteVideoCapable) {
             currentCapabilities = applyCapability(currentCapabilities,
-                    CallCapabilities.SUPPORTS_VT_REMOTE);
+                    PhoneCapabilities.SUPPORTS_VT_REMOTE);
         } else {
             currentCapabilities = removeCapability(currentCapabilities,
-                    CallCapabilities.SUPPORTS_VT_REMOTE);
+                    PhoneCapabilities.SUPPORTS_VT_REMOTE);
         }
 
         if (mLocalVideoCapable) {
             currentCapabilities = applyCapability(currentCapabilities,
-                    CallCapabilities.SUPPORTS_VT_LOCAL);
+                    PhoneCapabilities.SUPPORTS_VT_LOCAL);
         } else {
             currentCapabilities = removeCapability(currentCapabilities,
-                    CallCapabilities.SUPPORTS_VT_LOCAL);
+                    PhoneCapabilities.SUPPORTS_VT_LOCAL);
         }
         return currentCapabilities;
     }
@@ -520,9 +511,9 @@
 
         if (mAudioQuality ==
                 com.android.internal.telephony.Connection.AUDIO_QUALITY_HIGH_DEFINITION) {
-            currentCapabilities = applyCapability(currentCapabilities, CallCapabilities.VoLTE);
+            currentCapabilities = applyCapability(currentCapabilities, PhoneCapabilities.VoLTE);
         } else {
-            currentCapabilities = removeCapability(currentCapabilities, CallCapabilities.VoLTE);
+            currentCapabilities = removeCapability(currentCapabilities, PhoneCapabilities.VoLTE);
         }
 
         return currentCapabilities;
@@ -548,7 +539,7 @@
 
     /**
      * Sets whether video capability is present locally.  Used during rebuild of the
-     * {@link CallCapabilities} to set the video call capabilities.
+     * {@link PhoneCapabilities} to set the video call capabilities.
      *
      * @param capable {@code True} if video capable.
      */
@@ -559,7 +550,7 @@
 
     /**
      * Sets whether video capability is present remotely.  Used during rebuild of the
-     * {@link CallCapabilities} to set the video call capabilities.
+     * {@link PhoneCapabilities} to set the video call capabilities.
      *
      * @param capable {@code True} if video capable.
      */
@@ -570,7 +561,7 @@
 
     /**
      * Sets the current call audio quality.  Used during rebuild of the
-     * {@link CallCapabilities} to set or unset the {@link CallCapabilities#VoLTE} capability.
+     * {@link PhoneCapabilities} to set or unset the {@link PhoneCapabilities#VoLTE} capability.
      *
      * @param audioQuality The audio quality.
      */
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 7868c72..2211e3e 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -18,8 +18,8 @@
 
 import android.content.ComponentName;
 import android.net.Uri;
-import android.telecomm.CallCapabilities;
 import android.telecomm.Connection;
+import android.telecomm.PhoneCapabilities;
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ConnectionService;
 import android.telecomm.PhoneAccountHandle;
@@ -63,21 +63,21 @@
         Uri handle = request.getHandle();
         if (handle == null) {
             Log.d(this, "onCreateOutgoingConnection, handle is null");
-            return Connection.getFailedConnection(DisconnectCause.NO_PHONE_NUMBER_SUPPLIED,
+            return Connection.createFailedConnection(DisconnectCause.NO_PHONE_NUMBER_SUPPLIED,
                     "Handle is null");
         }
 
         if (!SCHEME_TEL.equals(handle.getScheme())) {
             Log.d(this, "onCreateOutgoingConnection, Handle %s is not type tel",
                     handle.getScheme());
-            return Connection.getFailedConnection(DisconnectCause.INVALID_NUMBER,
+            return Connection.createFailedConnection(DisconnectCause.INVALID_NUMBER,
                     "Handle scheme is not type tel");
         }
 
         final String number = handle.getSchemeSpecificPart();
         if (TextUtils.isEmpty(number)) {
             Log.d(this, "onCreateOutgoingConnection, unable to parse number");
-            return Connection.getFailedConnection(DisconnectCause.INVALID_NUMBER,
+            return Connection.createFailedConnection(DisconnectCause.INVALID_NUMBER,
                     "Unable to parse number");
         }
 
@@ -87,7 +87,7 @@
         final Phone phone = getPhoneForAccount(request.getAccountHandle(), isEmergencyNumber);
         if (phone == null) {
             Log.d(this, "onCreateOutgoingConnection, phone is null");
-            return Connection.getFailedConnection(DisconnectCause.OUTGOING_FAILURE,
+            return Connection.createFailedConnection(DisconnectCause.OUTGOING_FAILURE,
                     "Phone is null");
         }
 
@@ -98,21 +98,21 @@
                 case ServiceState.STATE_EMERGENCY_ONLY:
                     break;
                 case ServiceState.STATE_OUT_OF_SERVICE:
-                    return Connection.getFailedConnection(DisconnectCause.OUT_OF_SERVICE,
+                    return Connection.createFailedConnection(DisconnectCause.OUT_OF_SERVICE,
                             "ServiceState.STATE_OUT_OF_SERVICE");
                 case ServiceState.STATE_POWER_OFF:
-                    return Connection.getFailedConnection(DisconnectCause.POWER_OFF,
+                    return Connection.createFailedConnection(DisconnectCause.POWER_OFF,
                             "ServiceState.STATE_POWER_OFF");
                 default:
                     Log.d(this, "onCreateOutgoingConnection, unkown service state: %d", state);
-                    return Connection.getFailedConnection(DisconnectCause.OUTGOING_FAILURE,
+                    return Connection.createFailedConnection(DisconnectCause.OUTGOING_FAILURE,
                             "Unknown service state " + state);
             }
         }
 
         final TelephonyConnection connection = createConnectionFor(phone.getPhoneType(), null);
         if (connection == null) {
-            return Connection.getFailedConnection(
+            return Connection.createFailedConnection(
                     DisconnectCause.OUTGOING_FAILURE, "Invalid phone type");
         }
         connection.setHandle(handle, PhoneConstants.PRESENTATION_ALLOWED);
@@ -153,7 +153,7 @@
             Response<String, Connection> response) {
         Log.v(this, "onCreateConferenceConnection, connection: " + connection);
         if (connection instanceof GsmConnection || connection instanceof ConferenceConnection) {
-            if ((connection.getCallCapabilities() & CallCapabilities.MERGE_CALLS) != 0) {
+            if ((connection.getCallCapabilities() & PhoneCapabilities.MERGE_CALLS) != 0) {
                 response.onResult(token,
                         GsmConferenceController.createConferenceConnection(connection));
             }
@@ -168,28 +168,29 @@
 
         Phone phone = getPhoneForAccount(request.getAccountHandle(), false);
         if (phone == null) {
-            return Connection.getFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
+            return Connection.createFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
         }
 
         Call call = phone.getRingingCall();
         if (!call.getState().isRinging()) {
             Log.v(this, "onCreateIncomingConnection, no ringing call");
-            return Connection.getFailedConnection(DisconnectCause.INCOMING_MISSED,
+            return Connection.createFailedConnection(DisconnectCause.INCOMING_MISSED,
                     "Found no ringing call");
         }
 
         com.android.internal.telephony.Connection originalConnection = call.getEarliestConnection();
         if (isOriginalConnectionKnown(originalConnection)) {
             Log.v(this, "onCreateIncomingConnection, original connection already registered");
-            return Connection.getCanceledConnection();
+            return Connection.createCanceledConnection();
         }
 
         Connection connection = createConnectionFor(phone.getPhoneType(), originalConnection);
         if (connection == null) {
-            connection = Connection.getCanceledConnection();
+            connection = Connection.createCanceledConnection();
+            return Connection.createCanceledConnection();
+        } else {
+            return connection;
         }
-
-        return connection;
     }
 
     private void placeOutgoingConnection(
