diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a85710e..1a4fae7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -182,6 +182,13 @@
             </intent-filter>
         </receiver>
 
+        <receiver android:name="PhoneAccountBroadcastReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.PACKAGE_REMOVED" />
+                <data android:scheme="package" />
+            </intent-filter>
+        </receiver>
+
         <activity android:name=".RespondViaSmsSettings$Settings"
                   android:label="@string/respond_via_sms_setting_title"
                   android:configChanges="orientation|screenSize|keyboardHidden">
diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 6cfaeda..9d587ab 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -22,23 +22,23 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
-import android.telecomm.CallCapabilities;
-import android.telecomm.CallPropertyPresentation;
-import android.telecomm.CallState;
 import android.telecomm.Connection;
+import android.telecomm.PhoneCapabilities;
+import android.telecomm.PropertyPresentation;
+import android.telecomm.CallState;
 import android.telecomm.ConnectionRequest;
-import android.telecomm.ConnectionService.VideoCallProvider;
 import android.telecomm.GatewayInfo;
 import android.telecomm.ParcelableConnection;
 import android.telecomm.PhoneAccount;
 import android.telecomm.PhoneAccountHandle;
 import android.telecomm.Response;
 import android.telecomm.StatusHints;
+import android.telecomm.VideoProfile;
 import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
-import com.android.internal.telecomm.IVideoCallProvider;
+import com.android.internal.telecomm.IVideoProvider;
 import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.CallerInfoAsyncQuery;
 import com.android.internal.telephony.CallerInfoAsyncQuery.OnQueryCompleteListener;
@@ -65,7 +65,7 @@
      * Listener for events on the call.
      */
     interface Listener {
-        void onSuccessfulOutgoingCall(Call call, CallState callState);
+        void onSuccessfulOutgoingCall(Call call, int callState);
         void onFailedOutgoingCall(Call call, int errorCode, String errorMsg);
         void onCancelledOutgoingCall(Call call);
         void onSuccessfulIncomingCall(Call call);
@@ -94,7 +94,7 @@
 
     abstract static class ListenerBase implements Listener {
         @Override
-        public void onSuccessfulOutgoingCall(Call call, CallState callState) {}
+        public void onSuccessfulOutgoingCall(Call call, int callState) {}
         @Override
         public void onFailedOutgoingCall(Call call, int errorCode, String errorMsg) {}
         @Override
@@ -203,18 +203,18 @@
     private long mConnectTimeMillis;
 
     /** The state of the call. */
-    private CallState mState;
+    private int mState;
 
     /** The handle with which to establish this call. */
     private Uri mHandle;
 
-    /** The {@link CallPropertyPresentation} that controls how the handle is shown. */
+    /** The {@link PropertyPresentation} that controls how the handle is shown. */
     private int mHandlePresentation;
 
     /** The caller display name (CNAP) set by the connection service. */
     private String mCallerDisplayName;
 
-    /** The {@link CallPropertyPresentation} that controls how the caller display name is shown. */
+    /** The {@link PropertyPresentation} that controls how the caller display name is shown. */
     private int mCallerDisplayNamePresentation;
 
     /**
@@ -228,14 +228,14 @@
 
     /**
      * Tracks the video states which were applicable over the duration of a call.
-     * See {@link android.telecomm.VideoCallProfile} for a list of valid video states.
+     * See {@link VideoProfile} for a list of valid video states.
      */
     private int mVideoStateHistory;
 
     private int mVideoState;
 
     /**
-     * Disconnect cause for the call. Only valid if the state of the call is DISCONNECTED.
+     * Disconnect cause for the call. Only valid if the state of the call is STATE_DISCONNECTED.
      * See {@link android.telephony.DisconnectCause}.
      */
     private int mDisconnectCause = DisconnectCause.NOT_VALID;
@@ -279,7 +279,7 @@
     /** Whether an attempt has been made to load the text message responses. */
     private boolean mCannedSmsResponsesLoadingStarted = false;
 
-    private IVideoCallProvider mVideoCallProvider;
+    private IVideoProvider mVideoProvider;
 
     private boolean mAudioModeIsVoip;
     private StatusHints mStatusHints;
@@ -308,6 +308,7 @@
         mState = isConference ? CallState.ACTIVE : CallState.NEW;
         mRepository = repository;
         setHandle(handle);
+        setHandle(handle, PropertyPresentation.ALLOWED);
         mGatewayInfo = gatewayInfo;
         mConnectionManagerPhoneAccountHandle = connectionManagerPhoneAccountHandle;
         mTargetPhoneAccountHandle = targetPhoneAccountHandle;
@@ -336,7 +337,7 @@
                 Log.piiHandle(mHandle), getVideoState());
     }
 
-    CallState getState() {
+    int getState() {
         if (mIsConference) {
             if (!mChildCalls.isEmpty()) {
                 // If we have child calls, just return the child call.
@@ -354,9 +355,7 @@
      * misbehave and they do this very often. The result is that we do not enforce state transitions
      * and instead keep the code resilient to unexpected state changes.
      */
-    void setState(CallState newState) {
-        Preconditions.checkState(newState != CallState.DISCONNECTED ||
-                mDisconnectCause != DisconnectCause.NOT_VALID);
+    void setState(int newState) {
         if (mState != newState) {
             Log.v(this, "setState %s -> %s", mState, newState);
             mState = newState;
@@ -385,7 +384,7 @@
 
 
     void setHandle(Uri handle) {
-        setHandle(handle, CallPropertyPresentation.ALLOWED);
+        setHandle(handle, PropertyPresentation.ALLOWED);
     }
 
     void setHandle(Uri handle, int presentation) {
@@ -536,7 +535,7 @@
     }
 
     void setCallCapabilities(int callCapabilities) {
-        Log.v(this, "setCallCapabilities: %s", CallCapabilities.toString(callCapabilities));
+        Log.v(this, "setCallCapabilities: %s", PhoneCapabilities.toString(callCapabilities));
         if (mCallCapabilities != callCapabilities) {
            mCallCapabilities = callCapabilities;
             for (Listener l : mListeners) {
@@ -591,14 +590,14 @@
             if (mCallerInfo != null && mCallerInfo.shouldSendToVoicemail) {
                 Log.i(this, "Directing call to voicemail: %s.", this);
                 // TODO: Once we move State handling from CallsManager to Call, we
-                // will not need to set RINGING state prior to calling reject.
+                // will not need to set STATE_RINGING state prior to calling reject.
                 setState(CallState.RINGING);
                 reject(false, null);
             } else {
                 // TODO: Make this class (not CallsManager) responsible for changing
-                // the call state to RINGING.
+                // the call state to STATE_RINGING.
 
-                // TODO: Replace this with state transition to RINGING.
+                // TODO: Replace this with state transition to STATE_RINGING.
                 for (Listener l : mListeners) {
                     l.onSuccessfulIncomingCall(this);
                 }
@@ -628,7 +627,7 @@
         setCallerDisplayName(
                 connection.getCallerDisplayName(), connection.getCallerDisplayNamePresentation());
 
-        setVideoCallProvider(connection.getVideoCallProvider());
+        setVideoProvider(connection.getVideoProvider());
         setVideoState(connection.getVideoState());
 
         if (mIsIncoming) {
@@ -753,7 +752,7 @@
         if (isRinging("answer")) {
             // At this point, we are asking the connection service to answer but we don't assume
             // that it will work. Instead, we wait until confirmation from the connectino service
-            // that the call is in a non-RINGING state before changing the UI. See
+            // that the call is in a non-STATE_RINGING state before changing the UI. See
             // {@link ConnectionServiceAdapter#setActive} and other set* methods.
             mConnectionService.answer(this, videoState);
         }
@@ -800,10 +799,10 @@
     /** Checks if this is a live call or not. */
     boolean isAlive() {
         switch (mState) {
-            case NEW:
-            case RINGING:
-            case DISCONNECTED:
-            case ABORTED:
+            case CallState.NEW:
+            case CallState.RINGING:
+            case CallState.DISCONNECTED:
+            case CallState.ABORTED:
                 return false;
             default:
                 return true;
@@ -868,10 +867,6 @@
         // TODO: todo
     }
 
-    void swapWithBackgroundCall() {
-        mConnectionService.swapWithBackgroundCall(this);
-    }
-
     void setParentCall(Call parentCall) {
         if (parentCall == this) {
             Log.e(this, new Exception(), "setting the parent to self");
@@ -1122,28 +1117,23 @@
     /**
      * Sets a video call provider for the call.
      */
-    public void setVideoCallProvider(IVideoCallProvider videoCallProvider) {
-        mVideoCallProvider = videoCallProvider;
+    public void setVideoProvider(IVideoProvider videoProvider) {
+        mVideoProvider = videoProvider;
         for (Listener l : mListeners) {
             l.onVideoCallProviderChanged(Call.this);
         }
     }
 
     /**
-     * @return Return the {@link VideoCallProvider} binder.
+     * @return Return the {@link Connection.VideoProvider} binder.
      */
-    public IVideoCallProvider getVideoCallProvider() {
-        return mVideoCallProvider;
+    public IVideoProvider getVideoProvider() {
+        return mVideoProvider;
     }
 
     /**
      * The current video state for the call.
-     * Valid values: {@link android.telecomm.VideoCallProfile#VIDEO_STATE_AUDIO_ONLY},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_BIDIRECTIONAL},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_TX_ENABLED},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_RX_ENABLED}.
-     *
-     * @return True if video is enabled.
+     * Valid values: see {@link VideoProfile.VideoState}.
      */
     public int getVideoState() {
         return mVideoState;
@@ -1151,7 +1141,7 @@
 
     /**
      * Returns the video states which were applicable over the duration of a call.
-     * See {@link android.telecomm.VideoCallProfile} for a list of valid video states.
+     * See {@link VideoProfile} for a list of valid video states.
      *
      * @return The video states applicable over the duration of the call.
      */
@@ -1162,10 +1152,7 @@
     /**
      * Determines the current video state for the call.
      * For an outgoing call determines the desired video state for the call.
-     * Valid values: {@link android.telecomm.VideoCallProfile#VIDEO_STATE_AUDIO_ONLY},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_BIDIRECTIONAL},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_TX_ENABLED},
-     * {@link android.telecomm.VideoCallProfile#VIDEO_STATE_RX_ENABLED}.
+     * Valid values: see {@link VideoProfile.VideoState}
      *
      * @param videoState The video state for the call.
      */
@@ -1211,19 +1198,19 @@
         }
     }
 
-    private CallState getStateFromConnectionState(int state) {
+    private int getStateFromConnectionState(int state) {
         switch (state) {
-            case Connection.State.ACTIVE:
+            case Connection.STATE_ACTIVE:
                 return CallState.ACTIVE;
-            case Connection.State.DIALING:
+            case Connection.STATE_DIALING:
                 return CallState.DIALING;
-            case Connection.State.DISCONNECTED:
+            case Connection.STATE_DISCONNECTED:
                 return CallState.DISCONNECTED;
-            case Connection.State.HOLDING:
+            case Connection.STATE_HOLDING:
                 return CallState.ON_HOLD;
-            case Connection.State.NEW:
+            case Connection.STATE_NEW:
                 return CallState.NEW;
-            case Connection.State.RINGING:
+            case Connection.STATE_RINGING:
                 return CallState.RINGING;
         }
         return CallState.DISCONNECTED;
diff --git a/src/com/android/telecomm/CallAudioManager.java b/src/com/android/telecomm/CallAudioManager.java
index 1e15559..b42f5d8 100644
--- a/src/com/android/telecomm/CallAudioManager.java
+++ b/src/com/android/telecomm/CallAudioManager.java
@@ -18,7 +18,7 @@
 
 import android.content.Context;
 import android.media.AudioManager;
-import android.telecomm.CallAudioState;
+import android.telecomm.AudioState;
 import android.telecomm.CallState;
 
 import com.google.common.base.Preconditions;
@@ -37,7 +37,7 @@
     private final BluetoothManager mBluetoothManager;
     private final WiredHeadsetManager mWiredHeadsetManager;
 
-    private CallAudioState mAudioState;
+    private AudioState mAudioState;
     private int mAudioFocusStreamType;
     private boolean mIsRinging;
     private boolean mIsTonePlaying;
@@ -56,7 +56,7 @@
         mAudioFocusStreamType = STREAM_NONE;
     }
 
-    CallAudioState getAudioState() {
+    AudioState getAudioState() {
         return mAudioState;
     }
 
@@ -86,7 +86,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         onCallUpdated(call);
     }
 
@@ -100,7 +100,7 @@
         boolean isOnlyCall = CallsManager.getInstance().getCalls().size() == 1;
         if (isOnlyCall && mBluetoothManager.isBluetoothAvailable()) {
             mBluetoothManager.connectBluetoothAudio();
-            route = CallAudioState.ROUTE_BLUETOOTH;
+            route = AudioState.ROUTE_BLUETOOTH;
         }
 
         setSystemAudioState(false /* isMute */, route, mAudioState.supportedRouteMask);
@@ -129,14 +129,14 @@
             return;
         }
 
-        int newRoute = CallAudioState.ROUTE_EARPIECE;
+        int newRoute = AudioState.ROUTE_EARPIECE;
         if (newIsPluggedIn) {
-            newRoute = CallAudioState.ROUTE_WIRED_HEADSET;
+            newRoute = AudioState.ROUTE_WIRED_HEADSET;
         } else if (mWasSpeakerOn) {
             Call call = getForegroundCall();
             if (call != null && call.isAlive()) {
                 // Restore the speaker state.
-                newRoute = CallAudioState.ROUTE_SPEAKER;
+                newRoute = AudioState.ROUTE_SPEAKER;
             }
         }
         setSystemAudioState(mAudioState.isMuted, newRoute, calculateSupportedRoutes());
@@ -167,7 +167,7 @@
     /**
      * Changed the audio route, for example from earpiece to speaker phone.
      *
-     * @param route The new audio route to use. See {@link CallAudioState}.
+     * @param route The new audio route to use. See {@link AudioState}.
      */
     void setAudioRoute(int route) {
         // This can happen even when there are no calls and we don't have focus.
@@ -175,7 +175,7 @@
             return;
         }
 
-        Log.v(this, "setAudioRoute, route: %s", CallAudioState.audioRouteToString(route));
+        Log.v(this, "setAudioRoute, route: %s", AudioState.audioRouteToString(route));
 
         // Change ROUTE_WIRED_OR_EARPIECE to a single entry.
         int newRoute = selectWiredOrEarpiece(route, mAudioState.supportedRouteMask);
@@ -189,7 +189,7 @@
         if (mAudioState.route != newRoute) {
             // Remember the new speaker state so it can be restored when the user plugs and unplugs
             // a headset.
-            mWasSpeakerOn = newRoute == CallAudioState.ROUTE_SPEAKER;
+            mWasSpeakerOn = newRoute == AudioState.ROUTE_SPEAKER;
             setSystemAudioState(mAudioState.isMuted, newRoute, mAudioState.supportedRouteMask);
         }
     }
@@ -230,9 +230,9 @@
 
         int newRoute = mAudioState.route;
         if (bluetoothManager.isBluetoothAudioConnectedOrPending()) {
-            newRoute = CallAudioState.ROUTE_BLUETOOTH;
-        } else if (mAudioState.route == CallAudioState.ROUTE_BLUETOOTH) {
-            newRoute = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
+            newRoute = AudioState.ROUTE_BLUETOOTH;
+        } else if (mAudioState.route == AudioState.ROUTE_BLUETOOTH) {
+            newRoute = AudioState.ROUTE_WIRED_OR_EARPIECE;
             // Do not switch to speaker when bluetooth disconnects.
             mWasSpeakerOn = false;
         }
@@ -248,10 +248,10 @@
         return mBluetoothManager.isBluetoothAvailable();
     }
 
-    private void saveAudioState(CallAudioState audioState) {
+    private void saveAudioState(AudioState audioState) {
         mAudioState = audioState;
         mStatusBarNotifier.notifyMute(mAudioState.isMuted);
-        mStatusBarNotifier.notifySpeakerphone(mAudioState.route == CallAudioState.ROUTE_SPEAKER);
+        mStatusBarNotifier.notifySpeakerphone(mAudioState.route == AudioState.ROUTE_SPEAKER);
     }
 
     private void onCallUpdated(Call call) {
@@ -269,8 +269,8 @@
             return;
         }
 
-        CallAudioState oldAudioState = mAudioState;
-        saveAudioState(new CallAudioState(isMuted, route, supportedRouteMask));
+        AudioState oldAudioState = mAudioState;
+        saveAudioState(new AudioState(isMuted, route, supportedRouteMask));
         if (Objects.equals(oldAudioState, mAudioState)) {
             return;
         }
@@ -283,14 +283,14 @@
         }
 
         // Audio route.
-        if (mAudioState.route == CallAudioState.ROUTE_BLUETOOTH) {
+        if (mAudioState.route == AudioState.ROUTE_BLUETOOTH) {
             turnOnSpeaker(false);
             turnOnBluetooth(true);
-        } else if (mAudioState.route == CallAudioState.ROUTE_SPEAKER) {
+        } else if (mAudioState.route == AudioState.ROUTE_SPEAKER) {
             turnOnBluetooth(false);
             turnOnSpeaker(true);
-        } else if (mAudioState.route == CallAudioState.ROUTE_EARPIECE ||
-                mAudioState.route == CallAudioState.ROUTE_WIRED_HEADSET) {
+        } else if (mAudioState.route == AudioState.ROUTE_EARPIECE ||
+                mAudioState.route == AudioState.ROUTE_WIRED_HEADSET) {
             turnOnBluetooth(false);
             turnOnSpeaker(false);
         }
@@ -390,37 +390,37 @@
         // Since they are mutually exclusive and one is ALWAYS valid, we allow a special input of
         // ROUTE_WIRED_OR_EARPIECE so that callers dont have to make a call to check which is
         // supported before calling setAudioRoute.
-        if (route == CallAudioState.ROUTE_WIRED_OR_EARPIECE) {
-            route = CallAudioState.ROUTE_WIRED_OR_EARPIECE & supportedRouteMask;
+        if (route == AudioState.ROUTE_WIRED_OR_EARPIECE) {
+            route = AudioState.ROUTE_WIRED_OR_EARPIECE & supportedRouteMask;
             if (route == 0) {
                 Log.wtf(this, "One of wired headset or earpiece should always be valid.");
                 // assume earpiece in this case.
-                route = CallAudioState.ROUTE_EARPIECE;
+                route = AudioState.ROUTE_EARPIECE;
             }
         }
         return route;
     }
 
     private int calculateSupportedRoutes() {
-        int routeMask = CallAudioState.ROUTE_SPEAKER;
+        int routeMask = AudioState.ROUTE_SPEAKER;
 
         if (mWiredHeadsetManager.isPluggedIn()) {
-            routeMask |= CallAudioState.ROUTE_WIRED_HEADSET;
+            routeMask |= AudioState.ROUTE_WIRED_HEADSET;
         } else {
-            routeMask |= CallAudioState.ROUTE_EARPIECE;
+            routeMask |= AudioState.ROUTE_EARPIECE;
         }
 
         if (mBluetoothManager.isBluetoothAvailable()) {
-            routeMask |=  CallAudioState.ROUTE_BLUETOOTH;
+            routeMask |=  AudioState.ROUTE_BLUETOOTH;
         }
 
         return routeMask;
     }
 
-    private CallAudioState getInitialAudioState(Call call) {
+    private AudioState getInitialAudioState(Call call) {
         int supportedRouteMask = calculateSupportedRoutes();
         int route = selectWiredOrEarpiece(
-                CallAudioState.ROUTE_WIRED_OR_EARPIECE, supportedRouteMask);
+                AudioState.ROUTE_WIRED_OR_EARPIECE, supportedRouteMask);
 
         // We want the UI to indicate that "bluetooth is in use" in two slightly different cases:
         // (a) The obvious case: if a bluetooth headset is currently in use for an ongoing call.
@@ -430,22 +430,22 @@
         //     the first call.
         if (call != null && mBluetoothManager.isBluetoothAvailable()) {
             switch(call.getState()) {
-                case ACTIVE:
-                case ON_HOLD:
-                case DIALING:
-                case RINGING:
-                    route = CallAudioState.ROUTE_BLUETOOTH;
+                case CallState.ACTIVE:
+                case CallState.ON_HOLD:
+                case CallState.DIALING:
+                case CallState.RINGING:
+                    route = AudioState.ROUTE_BLUETOOTH;
                     break;
                 default:
                     break;
             }
         }
 
-        return new CallAudioState(false, route, supportedRouteMask);
+        return new AudioState(false, route, supportedRouteMask);
     }
 
     private void setInitialAudioState(Call call) {
-        CallAudioState audioState = getInitialAudioState(call);
+        AudioState audioState = getInitialAudioState(call);
         Log.v(this, "setInitialAudioState %s, %s", audioState, call);
         setSystemAudioState(audioState.isMuted, audioState.route, audioState.supportedRouteMask);
     }
diff --git a/src/com/android/telecomm/CallLogManager.java b/src/com/android/telecomm/CallLogManager.java
index 33c6d5a..d0668b9 100644
--- a/src/com/android/telecomm/CallLogManager.java
+++ b/src/com/android/telecomm/CallLogManager.java
@@ -22,7 +22,7 @@
 import android.provider.CallLog.Calls;
 import android.telecomm.CallState;
 import android.telecomm.PhoneAccountHandle;
-import android.telecomm.VideoCallProfile;
+import android.telecomm.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 
 import com.android.internal.telephony.CallerInfo;
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         if ((newState == CallState.DISCONNECTED || newState == CallState.ABORTED) &&
                 oldState != CallState.PRE_DIAL_WAIT) {
             int type;
@@ -180,8 +180,8 @@
      * @return The call features.
      */
     private static int getCallFeatures(int videoState) {
-        if ((videoState & VideoCallProfile.VideoState.TX_ENABLED)
-                == VideoCallProfile.VideoState.TX_ENABLED) {
+        if ((videoState & VideoProfile.VideoState.TX_ENABLED)
+                == VideoProfile.VideoState.TX_ENABLED) {
             return Calls.FEATURES_VIDEO;
         }
         return Calls.FEATURES_NONE;
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index d9d3ef9..74b6e44 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -18,13 +18,12 @@
 
 import android.net.Uri;
 import android.os.Bundle;
-import android.telecomm.CallAudioState;
+import android.telecomm.AudioState;
 import android.telecomm.CallState;
 import android.telecomm.GatewayInfo;
 import android.telecomm.PhoneAccountHandle;
 import android.telephony.DisconnectCause;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 
@@ -36,7 +35,7 @@
 /**
  * Singleton.
  *
- * NOTE(gilad): by design most APIs are package private, use the relevant adapter/s to allow
+ * NOTE: by design most APIs are package private, use the relevant adapter/s to allow
  * access from other packages specifically refraining from passing the CallsManager instance
  * beyond the com.android.telecomm package boundary.
  */
@@ -46,7 +45,7 @@
     interface CallsManagerListener {
         void onCallAdded(Call call);
         void onCallRemoved(Call call);
-        void onCallStateChanged(Call call, CallState oldState, CallState newState);
+        void onCallStateChanged(Call call, int oldState, int newState);
         void onConnectionServiceChanged(
                 Call call,
                 ConnectionServiceWrapper oldService,
@@ -54,7 +53,7 @@
         void onIncomingCallAnswered(Call call);
         void onIncomingCallRejected(Call call, boolean rejectWithMessage, String textMessage);
         void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall);
-        void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState);
+        void onAudioStateChanged(AudioState oldAudioState, AudioState newAudioState);
         void onRequestingRingback(Call call, boolean ringback);
         void onIsConferencedChanged(Call call);
         void onAudioModeIsVoipChanged(Call call);
@@ -123,7 +122,7 @@
     }
 
     @Override
-    public void onSuccessfulOutgoingCall(Call call, CallState callState) {
+    public void onSuccessfulOutgoingCall(Call call, int callState) {
         Log.v(this, "onSuccessfulOutgoingCall, %s", call);
         setCallState(call, callState);
         if (mCalls.contains(call)) {
@@ -245,7 +244,7 @@
         return false;
     }
 
-    CallAudioState getAudioState() {
+    AudioState getAudioState() {
         return mCallAudioManager.getAudioState();
     }
 
@@ -354,7 +353,7 @@
         // as if a phoneAccount was not specified (does the default behavior instead).
         if (accountHandle != null) {
             List<PhoneAccountHandle> enabledAccounts =
-                    app.getPhoneAccountRegistrar().getEnabledPhoneAccounts();
+                    app.getPhoneAccountRegistrar().getOutgoingPhoneAccounts();
             if (!enabledAccounts.contains(accountHandle)) {
                 accountHandle = null;
             }
@@ -425,7 +424,7 @@
             Log.i(this, "Request to answer a non-existent call %s", call);
         } else {
             // If the foreground call is not the ringing call and it is currently isActive() or
-            // DIALING, put it on hold before answering the call.
+            // STATE_DIALING, put it on hold before answering the call.
             if (mForegroundCall != null && mForegroundCall != call &&
                     (mForegroundCall.isActive() ||
                      mForegroundCall.getState() == CallState.DIALING)) {
@@ -588,7 +587,7 @@
     }
 
     /** Called when the audio state changes. */
-    void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState) {
+    void onAudioStateChanged(AudioState oldAudioState, AudioState newAudioState) {
         Log.v(this, "onAudioStateChanged, audioState: %s -> %s", oldAudioState, newAudioState);
         for (CallsManagerListener listener : mListeners) {
             listener.onAudioStateChanged(oldAudioState, newAudioState);
@@ -610,7 +609,7 @@
         setCallState(call, CallState.ACTIVE);
 
         if (call.getStartWithSpeakerphoneOn()) {
-            setAudioRoute(CallAudioState.ROUTE_SPEAKER);
+            setAudioRoute(AudioState.ROUTE_SPEAKER);
         }
     }
 
@@ -619,7 +618,7 @@
     }
 
     /**
-     * Marks the specified call as DISCONNECTED and notifies the in-call app. If this was the last
+     * Marks the specified call as STATE_DISCONNECTED and notifies the in-call app. If this was the last
      * live call, then also disconnect from the in-call controller.
      *
      * @param disconnectCause The disconnect reason, see {@link android.telephony.DisconnectCause}.
@@ -638,10 +637,11 @@
      * @param service The connection service that disconnected.
      */
     void handleConnectionServiceDeath(ConnectionServiceWrapper service) {
-        Preconditions.checkNotNull(service);
-        for (Call call : ImmutableList.copyOf(mCalls)) {
-            if (call.getConnectionService() == service) {
-                markCallAsDisconnected(call, DisconnectCause.ERROR_UNSPECIFIED, null);
+        if (service != null) {
+            for (Call call : ImmutableList.copyOf(mCalls)) {
+                if (call.getConnectionService() == service) {
+                    markCallAsDisconnected(call, DisconnectCause.ERROR_UNSPECIFIED, null);
+                }
             }
         }
     }
@@ -710,8 +710,8 @@
      * priority order so that any call with the first state will be returned before any call with
      * states listed later in the parameter list.
      */
-    Call getFirstCallWithState(CallState... states) {
-        for (CallState currentState : states) {
+    Call getFirstCallWithState(int... states) {
+        for (int currentState : states) {
             // check the foreground first
             if (mForegroundCall != null && mForegroundCall.getState() == currentState) {
                 return mForegroundCall;
@@ -769,14 +769,16 @@
      * @param call The call.
      * @param newState The new state of the call.
      */
-    private void setCallState(Call call, CallState newState) {
-        Preconditions.checkNotNull(newState);
-        CallState oldState = call.getState();
+    private void setCallState(Call call, int newState) {
+        if (call == null) {
+            return;
+        }
+        int oldState = call.getState();
         Log.i(this, "setCallState %s -> %s, call: %s", oldState, newState, call);
         if (newState != oldState) {
             // Unfortunately, in the telephony world the radio is king. So if the call notifies
             // us that the call is in a particular state, we allow it even if it doesn't make
-            // sense (e.g., ACTIVE -> RINGING).
+            // sense (e.g., STATE_ACTIVE -> STATE_RINGING).
             // TODO: Consider putting a stop to the above and turning CallState
             // into a well-defined state machine.
             // TODO: Define expected state transitions here, and log when an
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index 7753105..65ce4ac 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -16,7 +16,7 @@
 
 package com.android.telecomm;
 
-import android.telecomm.CallAudioState;
+import android.telecomm.AudioState;
 import android.telecomm.CallState;
 
 /**
@@ -32,7 +32,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
     }
 
     @Override
@@ -55,7 +55,7 @@
     }
 
     @Override
-    public void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState) {
+    public void onAudioStateChanged(AudioState oldAudioState, AudioState newAudioState) {
     }
 
     @Override
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index 76612d4..2d5ade2 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -24,7 +24,7 @@
 import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
-import android.telecomm.CallAudioState;
+import android.telecomm.AudioState;
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ConnectionService;
 import android.telecomm.GatewayInfo;
@@ -37,13 +37,11 @@
 import com.android.internal.os.SomeArgs;
 import com.android.internal.telecomm.IConnectionService;
 import com.android.internal.telecomm.IConnectionServiceAdapter;
-import com.android.internal.telecomm.IVideoCallProvider;
+import com.android.internal.telecomm.IVideoProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 import com.google.common.base.Preconditions;
 
-import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -73,7 +71,7 @@
     private static final int MSG_REMOVE_CALL = 13;
     private static final int MSG_ON_POST_DIAL_WAIT = 14;
     private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 15;
-    private static final int MSG_SET_CALL_VIDEO_PROVIDER = 16;
+    private static final int MSG_SET_VIDEO_PROVIDER = 16;
     private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 17;
     private static final int MSG_SET_STATUS_HINTS = 18;
     private static final int MSG_SET_HANDLE = 19;
@@ -90,10 +88,11 @@
                 case MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL: {
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
-                        ConnectionRequest request = (ConnectionRequest) args.arg1;
-                        if (mPendingResponses.containsKey(request.getCallId())) {
-                            ParcelableConnection connection = (ParcelableConnection) args.arg2;
-                            mPendingResponses.remove(request.getCallId()).
+                        String callId = (String) args.arg1;
+                        ConnectionRequest request = (ConnectionRequest) args.arg2;
+                        if (mPendingResponses.containsKey(callId)) {
+                            ParcelableConnection connection = (ParcelableConnection) args.arg3;
+                            mPendingResponses.remove(callId).
                                     handleCreateConnectionSuccessful(request, connection);
                         }
                     } finally {
@@ -104,11 +103,12 @@
                 case MSG_HANDLE_CREATE_CONNECTION_FAILED: {
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
-                        ConnectionRequest request = (ConnectionRequest) args.arg1;
+                        String callId = (String) args.arg1;
+                        ConnectionRequest request = (ConnectionRequest) args.arg2;
                         int statusCode = args.argi1;
-                        String statusMsg = (String) args.arg2;
+                        String statusMsg = (String) args.arg3;
                         removeCall(
-                                mCallIdMapper.getCall(request.getCallId()),
+                                mCallIdMapper.getCall(callId),
                                 statusCode,
                                 statusMsg);
                     } finally {
@@ -117,12 +117,18 @@
                     break;
                 }
                 case MSG_HANDLE_CREATE_CONNECTION_CANCELLED: {
-                    ConnectionRequest request = (ConnectionRequest) msg.obj;
-                    if (mPendingResponses.containsKey(request.getCallId())) {
-                        mPendingResponses.remove(
-                                request.getCallId()).handleCreateConnectionCancelled();
-                    } else {
-                        //Log.w(this, "handleCreateConnectionCancelled, unknown call: %s", callId);
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        String callId = (String) args.arg1;
+                        ConnectionRequest request = (ConnectionRequest) args.arg2;
+                        if (mPendingResponses.containsKey(callId)) {
+                            mPendingResponses.remove(callId)
+                                    .handleCreateConnectionCancelled();
+                        } else {
+                            //Log.w(this, "handleCreateConnectionCancelled, unknown call: %s", callId);
+                        }
+                    } finally {
+                        args.recycle();
                     }
                     break;
                 }
@@ -251,13 +257,13 @@
                     queryRemoteConnectionServices((RemoteServiceCallback) msg.obj);
                     break;
                 }
-                case MSG_SET_CALL_VIDEO_PROVIDER: {
+                case MSG_SET_VIDEO_PROVIDER: {
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
                         call = mCallIdMapper.getCall(args.arg1);
-                        IVideoCallProvider videoCallProvider = (IVideoCallProvider) args.arg2;
+                        IVideoProvider videoProvider = (IVideoProvider) args.arg2;
                         if (call != null) {
-                            call.setVideoCallProvider(videoCallProvider);
+                            call.setVideoProvider(videoProvider);
                         }
                     } finally {
                         args.recycle();
@@ -354,37 +360,50 @@
     };
 
     private final class Adapter extends IConnectionServiceAdapter.Stub {
+
         @Override
         public void handleCreateConnectionSuccessful(
-                ConnectionRequest request, ParcelableConnection connection) {
-
+                String callId,
+                ConnectionRequest request,
+                ParcelableConnection connection) {
             logIncoming("handleCreateConnectionSuccessful %s", request);
-            if (mCallIdMapper.isValidCallId(request.getCallId())) {
+            if (mCallIdMapper.isValidCallId(callId)) {
                 SomeArgs args = SomeArgs.obtain();
-                args.arg1 = request;
-                args.arg2 = connection;
-                mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL, args).sendToTarget();
+                args.arg1 = callId;
+                args.arg2 = request;
+                args.arg3 = connection;
+                mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_SUCCESSFUL, args)
+                        .sendToTarget();
             }
         }
 
         @Override
         public void handleCreateConnectionFailed(
-                ConnectionRequest request, int errorCode, String errorMsg) {
+                String callId,
+                ConnectionRequest request,
+                int errorCode,
+                String errorMsg) {
             logIncoming("handleCreateConnectionFailed %s %d %s", request, errorCode, errorMsg);
-            if (mCallIdMapper.isValidCallId(request.getCallId())) {
+            if (mCallIdMapper.isValidCallId(callId)) {
                 SomeArgs args = SomeArgs.obtain();
-                args.arg1 = request;
+                args.arg1 = callId;
+                args.arg2 = request;
                 args.argi1 = errorCode;
-                args.arg2 = errorMsg;
+                args.arg3 = errorMsg;
                 mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_FAILED, args).sendToTarget();
             }
         }
 
         @Override
-        public void handleCreateConnectionCancelled(ConnectionRequest request) {
+        public void handleCreateConnectionCancelled(
+                String callId,
+                ConnectionRequest request) {
             logIncoming("handleCreateConnectionCancelled %s", request);
-            if (mCallIdMapper.isValidCallId(request.getCallId())) {
-                mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_CANCELLED, request).sendToTarget();
+            if (mCallIdMapper.isValidCallId(callId)) {
+                SomeArgs args = SomeArgs.obtain();
+                args.arg1 = callId;
+                args.arg2 = request;
+                mHandler.obtainMessage(MSG_HANDLE_CREATE_CONNECTION_CANCELLED, args).sendToTarget();
             }
         }
 
@@ -405,13 +424,13 @@
         }
 
         @Override
-        public void setVideoCallProvider(String callId, IVideoCallProvider videoCallProvider) {
-            logIncoming("setVideoCallProvider %s", callId);
+        public void setVideoProvider(String callId, IVideoProvider videoProvider) {
+            logIncoming("setVideoProvider %s", callId);
             if (mCallIdMapper.isValidCallId(callId)) {
                 SomeArgs args = SomeArgs.obtain();
                 args.arg1 = callId;
-                args.arg2 = videoCallProvider;
-                mHandler.obtainMessage(MSG_SET_CALL_VIDEO_PROVIDER, args).sendToTarget();
+                args.arg2 = videoProvider;
+                mHandler.obtainMessage(MSG_SET_VIDEO_PROVIDER, args).sendToTarget();
             }
         }
 
@@ -648,9 +667,9 @@
                 try {
                     mServiceInterface.createConnection(
                             call.getConnectionManagerPhoneAccount(),
+                            callId,
                             new ConnectionRequest(
                                     call.getTargetPhoneAccount(),
-                                    callId,
                                     call.getHandle(),
                                     call.getHandlePresentation(),
                                     extras,
@@ -714,8 +733,8 @@
         }
     }
 
-    /** @see ConnectionService#onAudioStateChanged(String,CallAudioState) */
-    void onAudioStateChanged(Call activeCall, CallAudioState audioState) {
+    /** @see ConnectionService#onAudioStateChanged(String,AudioState) */
+    void onAudioStateChanged(Call activeCall, AudioState audioState) {
         final String callId = mCallIdMapper.getCallId(activeCall);
         if (callId != null && isServiceValid("onAudioStateChanged")) {
             try {
@@ -870,17 +889,6 @@
         }
     }
 
-    void swapWithBackgroundCall(Call call) {
-        final String callId = mCallIdMapper.getCallId(call);
-        if (callId != null && isServiceValid("swapWithBackgroundCall")) {
-            try {
-                logOutgoing("swapWithBackgroundCall %s", callId);
-                mServiceInterface.swapWithBackgroundCall(callId);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
     /** {@inheritDoc} */
     @Override
     protected void setServiceInterface(IBinder binder) {
@@ -936,7 +944,7 @@
 
         // Make a list of ConnectionServices that are listed as being associated with SIM accounts
         final Set<ConnectionServiceWrapper> simServices = new HashSet<>();
-        for (PhoneAccountHandle handle : registrar.getEnabledPhoneAccounts()) {
+        for (PhoneAccountHandle handle : registrar.getOutgoingPhoneAccounts()) {
             PhoneAccount account = registrar.getPhoneAccount(handle);
             if ((account.getCapabilities() & PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) != 0) {
                 ConnectionServiceWrapper service =
diff --git a/src/com/android/telecomm/CreateConnectionProcessor.java b/src/com/android/telecomm/CreateConnectionProcessor.java
index 8ba73bf..cc7808e 100644
--- a/src/com/android/telecomm/CreateConnectionProcessor.java
+++ b/src/com/android/telecomm/CreateConnectionProcessor.java
@@ -189,7 +189,7 @@
             Log.i(this, "Emergency number detected");
             mAttemptRecords.clear();
             List<PhoneAccountHandle> allAccountHandles = TelecommApp.getInstance()
-                    .getPhoneAccountRegistrar().getEnabledPhoneAccounts();
+                    .getPhoneAccountRegistrar().getOutgoingPhoneAccounts();
             for (int i = 0; i < allAccountHandles.size(); i++) {
                 if (TelephonyUtil.isPstnComponentName(
                         allAccountHandles.get(i).getComponentName())) {
diff --git a/src/com/android/telecomm/DtmfLocalTonePlayer.java b/src/com/android/telecomm/DtmfLocalTonePlayer.java
index e18f59c..715b1e8 100644
--- a/src/com/android/telecomm/DtmfLocalTonePlayer.java
+++ b/src/com/android/telecomm/DtmfLocalTonePlayer.java
@@ -20,7 +20,6 @@
 import android.media.ToneGenerator;
 import android.provider.Settings;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.Map;
@@ -57,13 +56,8 @@
     /** {@inheritDoc} */
     @Override
     public void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall) {
-        if (oldForegroundCall != null) {
-            endDtmfSession(oldForegroundCall);
-        }
-
-        if (newForegroundCall != null) {
-            startDtmfSession(newForegroundCall);
-        }
+        endDtmfSession(oldForegroundCall);
+        startDtmfSession(newForegroundCall);
     }
 
     /**
@@ -113,7 +107,9 @@
      * @param call The call associated with this dtmf session.
      */
     private void startDtmfSession(Call call) {
-        Preconditions.checkNotNull(call);
+        if (call == null) {
+            return;
+        }
         TelecommApp app = TelecommApp.getInstance();
 
         final boolean areLocalTonesEnabled;
@@ -144,8 +140,7 @@
      * @param call The call associated with the session to end.
      */
     private void endDtmfSession(Call call) {
-        Preconditions.checkNotNull(call);
-        if (mCall == call) {
+        if (call != null && mCall == call) {
             // Do a stopTone() in case the sessions ends before we are told to stop the tone.
             stopTone(call);
 
diff --git a/src/com/android/telecomm/InCallAdapter.java b/src/com/android/telecomm/InCallAdapter.java
index 66ce1ee..9f3fd0f 100644
--- a/src/com/android/telecomm/InCallAdapter.java
+++ b/src/com/android/telecomm/InCallAdapter.java
@@ -184,14 +184,6 @@
                         Log.w(this, "splitFromConference, unknown call id: %s", msg.obj);
                     }
                     break;
-                case MSG_SWAP_WITH_BACKGROUND_CALL:
-                    call = mCallIdMapper.getCall(msg.obj);
-                    if (call != null) {
-                        call.swapWithBackgroundCall();
-                    } else {
-                        Log.w(this, "swapWithBackgroundCall, unknown call id: %s", msg.obj);
-                    }
-                    break;
                 case MSG_TURN_ON_PROXIMITY_SENSOR:
                     mCallsManager.turnOnProximitySensor();
                     break;
@@ -328,13 +320,6 @@
     }
 
     @Override
-    public void swapWithBackgroundCall(String callId) {
-        if (mCallIdMapper.isValidCallId(callId)) {
-            mHandler.obtainMessage(MSG_SWAP_WITH_BACKGROUND_CALL, callId).sendToTarget();
-        }
-    }
-
-    @Override
     public void turnOnProximitySensor() {
         mHandler.obtainMessage(MSG_TURN_ON_PROXIMITY_SENSOR).sendToTarget();
     }
diff --git a/src/com/android/telecomm/InCallController.java b/src/com/android/telecomm/InCallController.java
index c94b656..4f24c27 100644
--- a/src/com/android/telecomm/InCallController.java
+++ b/src/com/android/telecomm/InCallController.java
@@ -27,9 +27,9 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.UserHandle;
-import android.telecomm.CallAudioState;
-import android.telecomm.CallCapabilities;
-import android.telecomm.CallPropertyPresentation;
+import android.telecomm.AudioState;
+import android.telecomm.PhoneCapabilities;
+import android.telecomm.PropertyPresentation;
 import android.telecomm.CallState;
 import android.telecomm.ParcelableCall;
 
@@ -159,7 +159,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         updateCall(call);
     }
 
@@ -172,7 +172,7 @@
     }
 
     @Override
-    public void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState) {
+    public void onAudioStateChanged(AudioState oldAudioState, AudioState newAudioState) {
         if (mInCallService != null) {
             Log.i(this, "Calling onAudioStateChanged, audioState: %s -> %s", oldAudioState,
                     newAudioState);
@@ -304,13 +304,13 @@
 
         int capabilities = call.getCallCapabilities();
         if (CallsManager.getInstance().isAddCallCapable(call)) {
-            capabilities |= CallCapabilities.ADD_CALL;
+            capabilities |= PhoneCapabilities.ADD_CALL;
         }
         if (!call.isEmergencyCall()) {
-            capabilities |= CallCapabilities.MUTE;
+            capabilities |= PhoneCapabilities.MUTE;
         }
 
-        CallState state = call.getState();
+        int state = call.getState();
         if (state == CallState.ABORTED) {
             state = CallState.DISCONNECTED;
         }
@@ -333,13 +333,13 @@
         }
 
         if (call.isRespondViaSmsCapable()) {
-            capabilities |= CallCapabilities.RESPOND_VIA_TEXT;
+            capabilities |= PhoneCapabilities.RESPOND_VIA_TEXT;
         }
 
-        Uri handle = call.getHandlePresentation() == CallPropertyPresentation.ALLOWED ?
+        Uri handle = call.getHandlePresentation() == PropertyPresentation.ALLOWED ?
                 call.getHandle() : null;
         String callerDisplayName = call.getCallerDisplayNamePresentation() ==
-                CallPropertyPresentation.ALLOWED ?  call.getCallerDisplayName() : null;
+                PropertyPresentation.ALLOWED ?  call.getCallerDisplayName() : null;
 
         List<Call> conferenceableCalls = call.getConferenceableCalls();
         List<String> conferenceableCallIds = new ArrayList<String>(conferenceableCalls.size());
@@ -364,7 +364,7 @@
                 call.getCallerDisplayNamePresentation(),
                 call.getGatewayInfo(),
                 call.getTargetPhoneAccount(),
-                call.getVideoCallProvider(),
+                call.getVideoProvider(),
                 parentCallId,
                 childCallIds,
                 call.getStatusHints(),
diff --git a/src/com/android/telecomm/InCallToneMonitor.java b/src/com/android/telecomm/InCallToneMonitor.java
index bafbfcc..5757540 100644
--- a/src/com/android/telecomm/InCallToneMonitor.java
+++ b/src/com/android/telecomm/InCallToneMonitor.java
@@ -16,7 +16,6 @@
 
 package com.android.telecomm;
 
-import android.telecomm.CallAudioState;
 import android.telecomm.CallState;
 import android.telephony.DisconnectCause;
 
@@ -37,7 +36,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         if (mCallsManager.getForegroundCall() != call) {
             // We only play tones for foreground calls.
             return;
diff --git a/src/com/android/telecomm/MissedCallNotifier.java b/src/com/android/telecomm/MissedCallNotifier.java
index 9e757df..94de312 100644
--- a/src/com/android/telecomm/MissedCallNotifier.java
+++ b/src/com/android/telecomm/MissedCallNotifier.java
@@ -71,7 +71,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         if (oldState == CallState.RINGING && newState == CallState.DISCONNECTED &&
                 call.getDisconnectCause() == DisconnectCause.INCOMING_MISSED) {
             showMissedCallNotification(call);
diff --git a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
index 71d8a96..a3aa740 100644
--- a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
@@ -26,7 +26,7 @@
 import android.telecomm.GatewayInfo;
 import android.telecomm.PhoneAccountHandle;
 import android.telecomm.TelecommManager;
-import android.telecomm.VideoCallProfile;
+import android.telecomm.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
@@ -130,7 +130,7 @@
                     mIntent.getBooleanExtra(TelecommManager.EXTRA_START_CALL_WITH_SPEAKERPHONE,
                             false),
                     mIntent.getIntExtra(TelecommManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
-                            VideoCallProfile.VideoState.AUDIO_ONLY));
+                            VideoProfile.VideoState.AUDIO_ONLY));
         }
     }
 
@@ -206,7 +206,7 @@
                     TelecommManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false);
             int videoState = mIntent.getIntExtra(
                     TelecommManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
-                    VideoCallProfile.VideoState.AUDIO_ONLY);
+                    VideoProfile.VideoState.AUDIO_ONLY);
             mCallsManager.placeOutgoingCall(mCall, Uri.fromParts(scheme, handle, null), null, null,
                     speakerphoneOn, videoState);
 
diff --git a/src/com/android/telecomm/PhoneAccountBroadcastReceiver.java b/src/com/android/telecomm/PhoneAccountBroadcastReceiver.java
new file mode 100644
index 0000000..8f70211
--- /dev/null
+++ b/src/com/android/telecomm/PhoneAccountBroadcastReceiver.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.telecomm;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import java.lang.String;
+
+/**
+ * Captures {@code android.intent.action.PACKAGE_REMOVED} intents and triggers the removal of
+ * associated {@link android.telecomm.PhoneAccount}s via the
+ * {@link com.android.telecomm.PhoneAccountRegistrar}.
+ */
+public class PhoneAccountBroadcastReceiver extends BroadcastReceiver {
+    /**
+     * Receives the intents the class is configured to received.
+     *
+     * @param context The Context in which the receiver is running.
+     * @param intent The Intent being received.
+     */
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
+            Uri uri = intent.getData();
+            if (uri == null) {
+                return;
+            }
+
+            String packageName = uri.getSchemeSpecificPart();
+            handlePackageRemoved(context, packageName);
+        }
+    }
+
+    /**
+     * Handles the removal of a package by calling upon the {@link PhoneAccountRegistrar} to
+     * un-register any {@link android.telecomm.PhoneAccount}s associated with the package.
+     *
+     * @param packageName The name of the removed package.
+     */
+    private void handlePackageRemoved(Context context, String packageName) {
+        TelecommApp telecommApp = TelecommApp.getInstance();
+        if (telecommApp == null) {
+            return;
+        }
+
+        PhoneAccountRegistrar registrar = telecommApp.getPhoneAccountRegistrar();
+        if (registrar == null) {
+            return;
+        }
+
+        registrar.clearAccounts(packageName);
+    }
+}
diff --git a/src/com/android/telecomm/PhoneAccountPreferencesActivity.java b/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
index 2551b47..a7a6a62 100644
--- a/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
+++ b/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
@@ -56,7 +56,7 @@
 
             mDefaultOutgoingAccount.setModel(
                     registrar,
-                    registrar.getEnabledPhoneAccounts(),
+                    registrar.getOutgoingPhoneAccounts(),
                     registrar.getDefaultOutgoingPhoneAccount(),
                     getString(R.string.account_ask_every_time));
 
diff --git a/src/com/android/telecomm/PhoneAccountRegistrar.java b/src/com/android/telecomm/PhoneAccountRegistrar.java
index c9e0e46..98dcdf3 100644
--- a/src/com/android/telecomm/PhoneAccountRegistrar.java
+++ b/src/com/android/telecomm/PhoneAccountRegistrar.java
@@ -19,7 +19,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
 import android.telecomm.ConnectionService;
 import android.telecomm.PhoneAccount;
 import android.telecomm.PhoneAccountHandle;
@@ -46,7 +45,9 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.String;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -97,14 +98,14 @@
             // as though there were no default
         }
 
-        List<PhoneAccountHandle> enabled = getEnabledPhoneAccounts();
-        switch (enabled.size()) {
+        List<PhoneAccountHandle> outgoing = getOutgoingPhoneAccounts();
+        switch (outgoing.size()) {
             case 0:
                 // There are no accounts, so there can be no default
                 return null;
             case 1:
                 // There is only one account, which is by definition the default
-                return enabled.get(0);
+                return outgoing.get(0);
             default:
                 // There are multiple accounts with no selected default
                 return null;
@@ -214,8 +215,7 @@
         return new ArrayList<>(mState.accounts);
     }
 
-    // TODO: Rename systemwide to "getCallProviderPhoneAccounts"?
-    public List<PhoneAccountHandle> getEnabledPhoneAccounts() {
+    public List<PhoneAccountHandle> getOutgoingPhoneAccounts() {
         return getCallProviderAccountHandles();
     }
 
@@ -258,18 +258,29 @@
         fireAccountsChanged();
     }
 
+    /**
+     * Un-registers all phone accounts associated with a specified package.
+     *
+     * @param packageName The package for which phone accounts will be removed.
+     */
     public void clearAccounts(String packageName) {
-        for (int i = 0; i < mState.accounts.size(); i++) {
+        boolean accountsRemoved = false;
+        Iterator<PhoneAccount> it = mState.accounts.iterator();
+        while (it.hasNext()) {
+            PhoneAccount phoneAccount = it.next();
             if (Objects.equals(
                     packageName,
-                    mState.accounts.get(i).getAccountHandle()
-                            .getComponentName().getPackageName())) {
-                mState.accounts.remove(i);
+                    phoneAccount.getAccountHandle().getComponentName().getPackageName())) {
+                Log.i(this, "Removing phone account " + phoneAccount.getLabel());
+                it.remove();
+                accountsRemoved = true;
             }
         }
 
-        write();
-        fireAccountsChanged();
+        if (accountsRemoved) {
+            write();
+            fireAccountsChanged();
+        }
     }
 
     public void addListener(Listener l) {
@@ -574,14 +585,15 @@
                         shortDescription = parser.getText();
                     }
                 }
-                return new PhoneAccount(
-                        accountHandle,
-                        handle,
-                        subscriptionNumber,
-                        capabilities,
-                        iconResId,
-                        label,
-                        shortDescription);
+                return PhoneAccount.builder()
+                        .withAccountHandle(accountHandle)
+                        .withHandle(handle)
+                        .withSubscriptionNumber(subscriptionNumber)
+                        .withCapabilities(capabilities)
+                        .withIconResId(iconResId)
+                        .withLabel(label)
+                        .withShortDescription(shortDescription)
+                        .build();
             }
             return null;
         }
diff --git a/src/com/android/telecomm/PhoneStateBroadcaster.java b/src/com/android/telecomm/PhoneStateBroadcaster.java
index 7aab729..fa5185e 100644
--- a/src/com/android/telecomm/PhoneStateBroadcaster.java
+++ b/src/com/android/telecomm/PhoneStateBroadcaster.java
@@ -29,19 +29,19 @@
  */
 final class PhoneStateBroadcaster extends CallsManagerListenerBase {
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         final String phoneState;
         switch (newState) {
-            case DIALING:
-            case ACTIVE:
-            case ON_HOLD:
+            case CallState.DIALING:
+            case CallState.ACTIVE:
+            case CallState.ON_HOLD:
                 phoneState = TelephonyManager.EXTRA_STATE_OFFHOOK;
                 break;
-            case RINGING:
+            case CallState.RINGING:
                 phoneState = TelephonyManager.EXTRA_STATE_RINGING;
                 break;
-            case ABORTED:
-            case DISCONNECTED:
+            case CallState.ABORTED:
+            case CallState.DISCONNECTED:
                 phoneState = TelephonyManager.EXTRA_STATE_IDLE;
                 break;
             default:
diff --git a/src/com/android/telecomm/Ringer.java b/src/com/android/telecomm/Ringer.java
index 69d3a6a..a5edeb9 100644
--- a/src/com/android/telecomm/Ringer.java
+++ b/src/com/android/telecomm/Ringer.java
@@ -99,7 +99,7 @@
     }
 
     @Override
-    public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
+    public void onCallStateChanged(Call call, int oldState, int newState) {
         if (newState != CallState.RINGING) {
             removeFromUnansweredCall(call);
         }
@@ -139,8 +139,8 @@
             stopCallWaiting();
         }
 
-        // We do not remove the call from mRingingCalls until the call state changes from RINGING
-        // or the call is removed. see onCallStateChanged or onCallRemoved.
+        // We do not remove the call from mRingingCalls until the call state changes from
+        // STATE_RINGING or the call is removed. see onCallStateChanged or onCallRemoved.
     }
 
     private Call getTopMostUnansweredCall() {
diff --git a/src/com/android/telecomm/TelecommServiceImpl.java b/src/com/android/telecomm/TelecommServiceImpl.java
index 6e657d5..7af1534 100644
--- a/src/com/android/telecomm/TelecommServiceImpl.java
+++ b/src/com/android/telecomm/TelecommServiceImpl.java
@@ -170,11 +170,11 @@
     }
 
     @Override
-    public List<PhoneAccountHandle> getEnabledPhoneAccounts() {
+    public List<PhoneAccountHandle> getOutgoingPhoneAccounts() {
         try {
-            return mPhoneAccountRegistrar.getEnabledPhoneAccounts();
+            return mPhoneAccountRegistrar.getOutgoingPhoneAccounts();
         } catch (Exception e) {
-            Log.e(this, e, "getEnabledPhoneAccounts");
+            Log.e(this, e, "getOutgoingPhoneAccounts");
             throw e;
         }
     }
diff --git a/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java b/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
index df66d0a..0688f3b 100644
--- a/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
+++ b/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
@@ -96,41 +96,44 @@
         TelecommManager telecommManager =
                 (TelecommManager) context.getSystemService(Context.TELECOMM_SERVICE);
 
-        telecommManager.clearAccounts(context.getPackageName());
+        telecommManager.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(
+                                new ComponentName(context, TestConnectionService.class),
+                                CALL_PROVIDER_ID))
+                .withHandle(Uri.parse("tel:555-TEST"))
+                .withSubscriptionNumber("555-TEST")
+                .withCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                .withIconResId(R.drawable.stat_sys_phone_call)
+                .withLabel("Dummy Service")
+                .withShortDescription("a short description for the dummy service")
+                .build());
 
-        // Register a call provider. This is used by 3rd party apps to provide voip calls.
-        telecommManager.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(
-                        new ComponentName(context, TestConnectionService.class),
-                        CALL_PROVIDER_ID),
-                Uri.parse("tel:555-TEST"),
-                "555-TEST",
-                PhoneAccount.CAPABILITY_CALL_PROVIDER,
-                R.drawable.stat_sys_phone_call,
-                "TelecommTestApp Call Provider",
-                "a short description for the call provider"));
+        telecommManager.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(
+                                new ComponentName(context, TestConnectionManager.class),
+                                SIM_SUBSCRIPTION_ID))
+                .withHandle(Uri.parse("tel:555-CMGR"))
+                .withSubscriptionNumber("555-CMGR")
+                .withCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+                .withIconResId(R.drawable.stat_sys_phone_call)
+                .withLabel("Dummy Connection Manager")
+                .withShortDescription("a short description for the dummy connection manager")
+                .build());
 
-        telecommManager.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(
-                        new ComponentName(context, TestConnectionService.class),
-                        SIM_SUBSCRIPTION_ID),
-                Uri.parse("tel:555-TSIM"),
-                "555-TSIM",
-                PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION,
-                R.drawable.stat_sys_phone_call,
-                "TelecommTestApp SIM Subscription",
-                "a short description for the sim subscription"));
-
-        telecommManager.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(
-                        new ComponentName(context, TestConnectionManager.class),
-                        CONNECTION_MANAGER_ID),
-                Uri.parse("tel:555-CMGR"),
-                "555-CMGR",
-                PhoneAccount.CAPABILITY_CONNECTION_MANAGER,
-                R.drawable.stat_sys_phone_call,
-                "TelecommTestApp CONNECTION MANAGER",
-                "a short description for the connection manager"));
+        telecommManager.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(
+                                new ComponentName(context, TestConnectionManager.class),
+                                CONNECTION_MANAGER_ID))
+                .withHandle(Uri.parse("tel:555-CMGR"))
+                .withSubscriptionNumber("555-CMGR")
+                .withCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+                .withIconResId(R.drawable.stat_sys_phone_call)
+                .withLabel("TelecommTestApp CONNECTION MANAGER")
+                .withShortDescription("a short description for the connection manager")
+                .build());
     }
 
     /**
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
index 2ee953f..69c5ea6 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
@@ -18,7 +18,7 @@
 
 import android.app.PendingIntent;
 import android.net.Uri;
-import android.telecomm.CallAudioState;
+import android.telecomm.AudioState;
 import android.telecomm.Connection;
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ConnectionService;
@@ -157,23 +157,23 @@
         }
 
         @Override
-        public void onSetAudioState(CallAudioState state) {
+        public void onSetAudioState(AudioState state) {
             mRemoteConnection.setAudioState(state);
         }
 
         private void setState(int state) {
             log("setState: " + state);
             switch (state) {
-                case State.ACTIVE:
+                case STATE_ACTIVE:
                     setActive();
                     break;
-                case State.HOLDING:
+                case STATE_HOLDING:
                     setOnHold();
                     break;
-                case State.DIALING:
+                case STATE_DIALING:
                     setDialing();
                     break;
-                case State.RINGING:
+                case STATE_RINGING:
                     setRinging();
                     break;
             }
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionService.java b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
index 6830803..09a8929 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionService.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
@@ -23,17 +23,16 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
-import android.telecomm.CallAudioState;
-import android.telecomm.CallCapabilities;
-import android.telecomm.CallPropertyPresentation;
+import android.telecomm.AudioState;
 import android.telecomm.Connection;
+import android.telecomm.PhoneCapabilities;
+import android.telecomm.PropertyPresentation;
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ConnectionService;
 import android.telecomm.PhoneAccountHandle;
 import android.telecomm.RemoteConnection;
-import android.telecomm.SimpleResponse;
 import android.telecomm.StatusHints;
-import android.telecomm.VideoCallProfile;
+import android.telecomm.VideoProfile;
 import android.telephony.DisconnectCause;
 import android.util.Log;
 
@@ -138,7 +137,7 @@
         private final boolean mIsIncoming;
 
         /** Used to cleanup camera and media when done with connection. */
-        private TestVideoCallProvider mTestVideoCallProvider;
+        private TestVideoProvider mTestVideoCallProvider;
 
         TestConnection(boolean isIncoming) {
             mIsIncoming = isIncoming;
@@ -148,7 +147,7 @@
             mRemoteConnection = remoteConnection;
             if (mRemoteConnection != null) {
                 mRemoteConnection.addListener(mProxyListener);
-                setState(mIsIncoming ? State.RINGING : State.DIALING);
+                setState(mIsIncoming ? STATE_RINGING : STATE_DIALING);
             }
         }
 
@@ -257,7 +256,7 @@
         }
 
         @Override
-        public void onSetAudioState(CallAudioState state) {
+        public void onSetAudioState(AudioState state) {
             if (mRemoteConnection != null) {
                 mRemoteConnection.setAudioState(state);
             }
@@ -266,22 +265,22 @@
         private void setState(int state) {
             log("setState: " + state);
             switch (state) {
-                case Connection.State.ACTIVE:
+                case STATE_ACTIVE:
                     setActive();
                     break;
-                case Connection.State.HOLDING:
+                case STATE_HOLDING:
                     setOnHold();
                     break;
-                case Connection.State.DIALING:
+                case STATE_DIALING:
                     setDialing();
                     break;
-                case Connection.State.RINGING:
+                case STATE_RINGING:
                     setRinging();
                     break;
             }
         }
 
-        public void setTestVideoCallProvider(TestVideoCallProvider testVideoCallProvider) {
+        public void setTestVideoCallProvider(TestVideoProvider testVideoCallProvider) {
             mTestVideoCallProvider = testVideoCallProvider;
         }
 
@@ -305,7 +304,7 @@
         private final RemoteConnection.Listener mRemoteListener = new RemoteConnection.Listener() {
             @Override
             public void onStateChanged(RemoteConnection conn, int newState) {
-                if (newState != Connection.State.INITIALIZING) {
+                if (newState != Connection.STATE_INITIALIZING) {
                     // Set the underlying connection
                     mTestConnection.setRemoteConnection(conn);
                 } else {
@@ -331,7 +330,6 @@
             if (mAccountIterator.hasNext()) {
                 ConnectionRequest connectionRequest = new ConnectionRequest(
                         mAccountIterator.next(),
-                        mOriginalRequest.getCallId(),
                         mOriginalRequest.getHandle(),
                         mOriginalRequest.getHandlePresentation(),
                         null,
@@ -431,6 +429,16 @@
         // use a remote connection service.
         // TODO: Have a special phone number to test the account-picker dialog flow.
         if (number != null && number.startsWith("555")) {
+            // Normally we would use the original request as is, but for testing purposes, we are
+            // adding ".." to the end of the number to follow its path more easily through the logs.
+            final ConnectionRequest request = new ConnectionRequest(
+                    originalRequest.getAccountHandle(),
+                    Uri.fromParts(handle.getScheme(),
+                    handle.getSchemeSpecificPart() + "..", ""),
+                    originalRequest.getHandlePresentation(),
+                    originalRequest.getExtras(),
+                    originalRequest.getVideoState());
+
             mCalls.add(connection);
             connection.startOutgoing();
         } else {
@@ -457,9 +465,9 @@
             // Use dummy number for testing incoming calls.
             Uri handle = Uri.fromParts(SCHEME_TEL, getDummyNumber(isVideoCall), null);
             if (isVideoCall) {
-                TestVideoCallProvider testVideoCallProvider =
-                        new TestVideoCallProvider(getApplicationContext());
-                connection.setVideoCallProvider(testVideoCallProvider);
+                TestVideoProvider testVideoCallProvider =
+                        new TestVideoProvider(getApplicationContext());
+                connection.setVideoProvider(testVideoCallProvider);
 
                 // Keep reference to original so we can clean up the media players later.
                 connection.setTestVideoCallProvider(testVideoCallProvider);
@@ -467,27 +475,27 @@
 
             // Assume all calls are video capable.
             int capabilities = connection.getCallCapabilities();
-            capabilities |= CallCapabilities.SUPPORTS_VT_LOCAL;
-            capabilities |= CallCapabilities.ALL;
+            capabilities |= PhoneCapabilities.SUPPORTS_VT_LOCAL;
+            capabilities |= PhoneCapabilities.ALL;
             connection.setCallCapabilities(capabilities);
 
             int videoState = isVideoCall ?
-                    VideoCallProfile.VideoState.BIDIRECTIONAL :
-                    VideoCallProfile.VideoState.AUDIO_ONLY;
+                    VideoProfile.VideoState.BIDIRECTIONAL :
+                    VideoProfile.VideoState.AUDIO_ONLY;
             connection.setVideoState(videoState);
-            connection.setHandle(handle, CallPropertyPresentation.ALLOWED);
+            connection.setHandle(handle, PropertyPresentation.ALLOWED);
 
             mCalls.add(connection);
 
             ConnectionRequest newRequest = new ConnectionRequest(
                     request.getAccountHandle(),
-                    request.getCallId(),
                     handle,
                     request.getHandlePresentation(),
                     request.getExtras(),
                     videoState);
             connection.setVideoState(videoState);
         } else {
+            /*
             SimpleResponse<Uri, List<PhoneAccountHandle>> accountResponse =
                     new SimpleResponse<Uri, List<PhoneAccountHandle>>() {
                         @Override
@@ -507,6 +515,7 @@
                         }
                     };
             connection.setInitializing();
+            */
         }
         return connection;
     }
diff --git a/tests/src/com/android/telecomm/testapps/TestVideoCallProvider.java b/tests/src/com/android/telecomm/testapps/TestVideoProvider.java
similarity index 93%
rename from tests/src/com/android/telecomm/testapps/TestVideoCallProvider.java
rename to tests/src/com/android/telecomm/testapps/TestVideoProvider.java
index 94d0618..64a64ed 100644
--- a/tests/src/com/android/telecomm/testapps/TestVideoCallProvider.java
+++ b/tests/src/com/android/telecomm/testapps/TestVideoProvider.java
@@ -34,10 +34,9 @@
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.MediaPlayer;
 import android.os.Handler;
-import android.telecomm.CallCameraCapabilities;
-import android.telecomm.ConnectionService;
-import android.telecomm.InCallService.VideoCall;
-import android.telecomm.VideoCallProfile;
+import android.telecomm.CameraCapabilities;
+import android.telecomm.Connection;
+import android.telecomm.VideoProfile;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Size;
@@ -52,8 +51,8 @@
 /**
  * Implements the VideoCallProvider.
  */
-public class TestVideoCallProvider extends ConnectionService.VideoCallProvider {
-    private CallCameraCapabilities mCameraCapabilities;
+public class TestVideoProvider extends Connection.VideoProvider {
+    private CameraCapabilities mCameraCapabilities;
     private Random random;
     private Surface mDisplaySurface;
     private Surface mPreviewSurface;
@@ -70,7 +69,7 @@
 
     private static final long SESSION_TIMEOUT_MS = 2000;
 
-    public TestVideoCallProvider(Context context) {
+    public TestVideoProvider(Context context) {
         mContext = context;
         random = new Random();
         mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
@@ -141,19 +140,19 @@
      * the response back via the CallVideoClient.
      */
     @Override
-    public void onSendSessionModifyRequest(VideoCallProfile requestProfile) {
+    public void onSendSessionModifyRequest(VideoProfile requestProfile) {
         log("Sent session modify request");
 
-        VideoCallProfile responseProfile = new VideoCallProfile(
+        VideoProfile responseProfile = new VideoProfile(
                 requestProfile.getVideoState(), requestProfile.getQuality());
         receiveSessionModifyResponse(
-                VideoCall.SESSION_MODIFY_REQUEST_SUCCESS,
+                SESSION_MODIFY_REQUEST_SUCCESS,
                 requestProfile,
                 responseProfile);
     }
 
     @Override
-    public void onSendSessionModifyResponse(VideoCallProfile responseProfile) {
+    public void onSendSessionModifyResponse(VideoProfile responseProfile) {
 
     }
 
@@ -328,7 +327,7 @@
                     CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
             Size previewSize = map.getOutputSizes(SurfaceTexture.class)[0];
 
-            mCameraCapabilities = new CallCameraCapabilities(true, 1.0f, previewSize.getWidth(),
+            mCameraCapabilities = new CameraCapabilities(true, 1.0f, previewSize.getWidth(),
                     previewSize.getHeight());
         }
     }
diff --git a/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java b/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
index b74f282..9daa026 100644
--- a/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
+++ b/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
@@ -44,38 +44,48 @@
     @Override
     public void setUp() {
         mRegistrar = new PhoneAccountRegistrar(getContext(), FILE_NAME);
-        mRegistrar.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"),
-                Uri.parse("tel:555-1212"),
-                "555-1212",
-                PhoneAccount.CAPABILITY_CONNECTION_MANAGER,
-                0,
-                "label0",
-                "desc0"));
-        mRegistrar.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1"),
-                Uri.parse("tel:555-1212"),
-                "555-1212",
-                PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION,
-                0,
-                "label1",
-                "desc1"));
-        mRegistrar.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id2"),
-                Uri.parse("tel:555-1212"),
-                "555-1212",
-                PhoneAccount.CAPABILITY_CALL_PROVIDER,
-                0,
-                "label2",
-                "desc2"));
-        mRegistrar.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id3"),
-                Uri.parse("tel:555-1212"),
-                "555-1212",
-                PhoneAccount.CAPABILITY_CALL_PROVIDER,
-                0,
-                "label2",
-                "desc2"));
+        mRegistrar.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"))
+                .withHandle(Uri.parse("tel:555-1212"))
+                .withSubscriptionNumber("555-1212")
+                .withCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+                .withIconResId(0)
+                .withLabel("label0")
+                .withShortDescription("desc0")
+                .build());
+        mRegistrar.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1"))
+                .withHandle(Uri.parse("tel:555-1212"))
+                .withSubscriptionNumber("555-1212")
+                .withCapabilities(
+                        PhoneAccount.CAPABILITY_CALL_PROVIDER
+                                | PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)
+                .withIconResId(0)
+                .withLabel("label1")
+                .withShortDescription("desc1")
+                .build());
+        mRegistrar.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id2"))
+                .withHandle(Uri.parse("tel:555-1212"))
+                .withSubscriptionNumber("555-1212")
+                .withCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                .withIconResId(0)
+                .withLabel("label2")
+                .withShortDescription("desc2")
+                .build());
+        mRegistrar.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(
+                        new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id3"))
+                .withHandle(Uri.parse("tel:555-1212"))
+                .withSubscriptionNumber("555-1212")
+                .withCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                .withIconResId(0)
+                .withLabel("label2")
+                .withShortDescription("desc2")
+                .build());
     }
 
     @Override
@@ -159,7 +169,7 @@
         PhoneAccount input = makeQuickAccount("pkg0", "cls0", "id0", 0);
         PhoneAccount result = roundTrip(this, input, PhoneAccountRegistrar.sPhoneAccountXml);
         assertPhoneAccountEquals(input, result);
-        PhoneAccount inputN = new PhoneAccount(null, null, null, 0, 0, null, null);
+        PhoneAccount inputN = PhoneAccount.builder().build();
         PhoneAccount resultN = roundTrip(this, inputN, PhoneAccountRegistrar.sPhoneAccountXml);
         assertPhoneAccountEquals(inputN, resultN);
     }
@@ -181,7 +191,7 @@
 
     public void testAccounts() throws Exception {
         assertEquals(4, mRegistrar.getAllPhoneAccountHandles().size());
-        assertEquals(3, mRegistrar.getEnabledPhoneAccounts().size());
+        assertEquals(3, mRegistrar.getOutgoingPhoneAccounts().size());
         assertEquals(null, mRegistrar.getSimCallManager());
         assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount());
     }
@@ -239,26 +249,28 @@
         // If have one account but not suitable, default returns null
         mRegistrar.unregisterPhoneAccount(
                 new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id3"));
-        mRegistrar.registerPhoneAccount(new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"),
-                Uri.parse("tel:555-1212"),
-                "555-1212",
-                PhoneAccount.CAPABILITY_CONNECTION_MANAGER,
-                0,
-                "label0",
-                "desc0"));
+        mRegistrar.registerPhoneAccount(PhoneAccount.builder()
+                .withAccountHandle(new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"))
+                .withHandle(Uri.parse("tel:555-1212"))
+                .withSubscriptionNumber("555-1212")
+                .withCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+                .withIconResId(0)
+                .withLabel("label0")
+                .withShortDescription("desc0")
+                .build());
         assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount());
     }
 
     private static PhoneAccount makeQuickAccount(String pkg, String cls, String id, int idx) {
-        return new PhoneAccount(
-                new PhoneAccountHandle(new ComponentName(pkg, cls), id),
-                Uri.parse("http://foo.com/" + idx),
-                "555-000" + idx,
-                idx,
-                idx,
-                "label" + idx,
-                "desc" + idx);
+        return PhoneAccount.builder()
+                .withAccountHandle(new PhoneAccountHandle(new ComponentName(pkg, cls), id))
+                .withHandle(Uri.parse("http://foo.com/" + idx))
+                .withSubscriptionNumber("555-000" + idx)
+                .withCapabilities(idx)
+                .withIconResId(idx)
+                .withLabel("label" + idx)
+                .withShortDescription("desc" + idx)
+                .build();
     }
 
     private static PhoneAccountRegistrar.State makeQuickState() {
