diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 6cfaeda..20bf353 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,7 +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) {
+    void setState(int newState) {
         Preconditions.checkState(newState != CallState.DISCONNECTED ||
                 mDisconnectCause != DisconnectCause.NOT_VALID);
         if (mState != newState) {
@@ -385,7 +386,7 @@
 
 
     void setHandle(Uri handle) {
-        setHandle(handle, CallPropertyPresentation.ALLOWED);
+        setHandle(handle, PropertyPresentation.ALLOWED);
     }
 
     void setHandle(Uri handle, int presentation) {
@@ -536,7 +537,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 +592,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 +629,7 @@
         setCallerDisplayName(
                 connection.getCallerDisplayName(), connection.getCallerDisplayNamePresentation());
 
-        setVideoCallProvider(connection.getVideoCallProvider());
+        setVideoProvider(connection.getVideoProvider());
         setVideoState(connection.getVideoState());
 
         if (mIsIncoming) {
@@ -753,7 +754,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 +801,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 +869,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 +1119,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 +1143,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 +1154,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 +1200,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..5f01cb8 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -18,7 +18,7 @@
 
 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;
@@ -46,7 +46,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 +54,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 +123,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 +245,7 @@
         return false;
     }
 
-    CallAudioState getAudioState() {
+    AudioState getAudioState() {
         return mCallAudioManager.getAudioState();
     }
 
@@ -354,7 +354,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 +425,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 +588,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 +610,7 @@
         setCallState(call, CallState.ACTIVE);
 
         if (call.getStartWithSpeakerphoneOn()) {
-            setAudioRoute(CallAudioState.ROUTE_SPEAKER);
+            setAudioRoute(AudioState.ROUTE_SPEAKER);
         }
     }
 
@@ -619,7 +619,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}.
@@ -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,14 @@
      * @param call The call.
      * @param newState The new state of the call.
      */
-    private void setCallState(Call call, CallState newState) {
+    private void setCallState(Call call, int newState) {
         Preconditions.checkNotNull(newState);
-        CallState oldState = call.getState();
+        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/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/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..294fedb 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;
@@ -97,14 +96,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 +213,7 @@
         return new ArrayList<>(mState.accounts);
     }
 
-    // TODO: Rename systemwide to "getCallProviderPhoneAccounts"?
-    public List<PhoneAccountHandle> getEnabledPhoneAccounts() {
+    public List<PhoneAccountHandle> getOutgoingPhoneAccounts() {
         return getCallProviderAccountHandles();
     }
 
@@ -574,14 +572,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;
         }
     }
