diff --git a/sip/src/com/android/services/telephony/sip/SipConnection.java b/sip/src/com/android/services/telephony/sip/SipConnection.java
index 6ba2684..58db1f5 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnection.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnection.java
@@ -18,9 +18,9 @@
 
 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.util.Log;
 
 import com.android.internal.telephony.Call;
@@ -65,7 +65,7 @@
     }
 
     @Override
-    public void onSetAudioState(CallAudioState state) {
+    public void onSetAudioState(AudioState state) {
         if (VERBOSE) log("onSetAudioState: " + state);
         if (getPhone() != null) {
             getPhone().setEchoSuppressionEnabled();
@@ -129,7 +129,7 @@
     public void onHold() {
         if (VERBOSE) log("onHold");
         try {
-            if (getPhone() != null && getState() == State.ACTIVE) {
+            if (getPhone() != null && getState() == STATE_ACTIVE) {
                 getPhone().switchHoldingAndActive();
             }
         } catch (CallStateException e) {
@@ -141,7 +141,7 @@
     public void onUnhold() {
         if (VERBOSE) log("onUnhold");
         try {
-            if (getPhone() != null && getState() == State.HOLDING) {
+            if (getPhone() != null && getState() == STATE_HOLDING) {
                 getPhone().switchHoldingAndActive();
             }
         } catch (CallStateException e) {
@@ -180,12 +180,6 @@
     }
 
     @Override
-    public void onSwapWithBackgroundCall() {
-        if (VERBOSE) log("onSwapWithBackgroundCall");
-        // TODO: Implement swap.
-    }
-
-    @Override
     public void onChildrenChanged(List<Connection> children) {
         if (VERBOSE) log("onChildrenChanged, children: " + children);
     }
@@ -254,9 +248,9 @@
     }
 
     private 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;
         }
         return capabilities;
     }
diff --git a/sip/src/com/android/services/telephony/sip/SipConnectionService.java b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
index 5aaa20c..bda564f 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnectionService.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
@@ -102,14 +102,14 @@
 
         if (request.getExtras() == null) {
             if (VERBOSE) log("onCreateIncomingConnection, no extras");
-            return Connection.getFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
+            return Connection.createFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
         }
 
         Intent sipIntent = (Intent) request.getExtras().getParcelable(
                 SipUtil.EXTRA_INCOMING_CALL_INTENT);
         if (sipIntent == null) {
             if (VERBOSE) log("onCreateIncomingConnection, no SIP intent");
-            return Connection.getFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
+            return Connection.createFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
         }
 
         SipAudioCall sipAudioCall;
@@ -117,7 +117,7 @@
             sipAudioCall = SipManager.newInstance(this).takeAudioCall(sipIntent, null);
         } catch (SipException e) {
             log("onCreateIncomingConnection, takeAudioCall exception: " + e);
-            return Connection.getCanceledConnection();
+            return Connection.createCanceledConnection();
         }
 
         SipPhone phone = findPhoneForProfile(sipAudioCall.getLocalProfile());
@@ -132,10 +132,10 @@
                 return new SipConnection();
             } else {
                 if (VERBOSE) log("onCreateIncomingConnection, takingIncomingCall failed");
-                return Connection.getCanceledConnection();
+                return Connection.createCanceledConnection();
             }
         }
-        return Connection.getFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
+        return Connection.createFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
     }
 
     @Override
@@ -208,7 +208,7 @@
     private ConnectionRequest getConnectionRequestForIncomingCall(ConnectionRequest request,
             com.android.internal.telephony.Connection connection) {
         Uri uri = Uri.fromParts(SipUtil.SCHEME_SIP, connection.getAddress(), null);
-        return new ConnectionRequest(request.getAccountHandle(), request.getCallId(), uri,
+        return new ConnectionRequest(request.getAccountHandle(), uri,
                 connection.getNumberPresentation(), request.getExtras(), 0);
     }
 
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(
