diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index 3531df6..1ef869b 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -1235,7 +1235,7 @@
                     // TODO: Need to set tint.
                 }
 
-                builder.build();
+                return builder.build();
             }
             return null;
         }
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index 573ef4a..bf7834e 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -52,6 +52,7 @@
 import android.telecom.ConnectionService;
 import android.telecom.InCallService;
 import android.telecom.PhoneAccount;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.test.mock.MockContext;
 
@@ -147,6 +148,8 @@
                     return mNotificationManager;
                 case Context.USER_SERVICE:
                     return mUserManager;
+                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
+                    return mSubscriptionManager;
                 default:
                     return null;
             }
@@ -222,6 +225,12 @@
         }
 
         @Override
+        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
+                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
+                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
+        }
+
+        @Override
         public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
                 throws PackageManager.NameNotFoundException {
             return this;
@@ -256,6 +265,7 @@
     private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
     private final NotificationManager mNotificationManager = mock(NotificationManager.class);
     private final UserManager mUserManager = mock(UserManager.class);
+    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
     private final Resources mResources = mock(Resources.class);
     private final Configuration mResourceConfiguration = new Configuration();
 
diff --git a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
index c55e89c..aa4a8e6 100644
--- a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
+++ b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
@@ -16,7 +16,6 @@
 
 package com.android.server.telecom.tests;
 
-import android.annotation.TargetApi;
 import android.os.Binder;
 
 import com.android.internal.telecom.IConnectionService;
@@ -30,7 +29,6 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
@@ -96,6 +94,7 @@
                 .build();
         PhoneAccount result = roundTripXml(this, input, PhoneAccountRegistrar.sPhoneAccountXml,
                 mContext);
+
         assertPhoneAccountEquals(input, result);
     }
 
@@ -107,6 +106,11 @@
         assertStateEquals(input, result);
     }
 
+    private void registerAndEnableAccount(PhoneAccount account) {
+        mRegistrar.registerPhoneAccount(account);
+        mRegistrar.enablePhoneAccount(account.getAccountHandle(), true);
+    }
+
     public void testAccounts() throws Exception {
         int i = 0;
 
@@ -114,19 +118,19 @@
                 makeQuickConnectionServiceComponentName(),
                 Mockito.mock(IConnectionService.class));
 
-        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
+        registerAndEnableAccount(makeQuickAccountBuilder("id" + i, i++)
                 .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
                         | PhoneAccount.CAPABILITY_CALL_PROVIDER)
                 .build());
-        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
+        registerAndEnableAccount(makeQuickAccountBuilder("id" + i, i++)
                 .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
                         | PhoneAccount.CAPABILITY_CALL_PROVIDER)
                 .build());
-        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
+        registerAndEnableAccount(makeQuickAccountBuilder("id" + i, i++)
                 .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
                         | PhoneAccount.CAPABILITY_CALL_PROVIDER)
                 .build());
-        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
+        registerAndEnableAccount(makeQuickAccountBuilder("id" + i, i++)
                 .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                 .build());
 
@@ -146,7 +150,7 @@
                 .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER
                         | PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                 .build();
-        mRegistrar.registerPhoneAccount(simManagerAccount);
+        registerAndEnableAccount(simManagerAccount);
         assertNull(mRegistrar.getSimCallManager());
 
         // Test the basic case
@@ -158,7 +162,7 @@
         assertNull(mRegistrar.getSimCallManager());
 
         // Re-registering it makes the setting come back
-        mRegistrar.registerPhoneAccount(simManagerAccount);
+        registerAndEnableAccount(simManagerAccount);
         assertEquals(simManager, mRegistrar.getSimCallManager());
 
         // Make sure that the manager has CAPABILITY_CONNECTION_MANAGER
@@ -185,7 +189,7 @@
 
         // Register one tel: account
         PhoneAccountHandle telAccount = makeQuickAccountHandle("tel_acct");
-        mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(telAccount, "tel_acct")
+        registerAndEnableAccount(new PhoneAccount.Builder(telAccount, "tel_acct")
                 .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
                 .addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
                 .build());
@@ -195,7 +199,7 @@
 
         // Add a SIP account, make sure tel: doesn't change
         PhoneAccountHandle sipAccount = makeQuickAccountHandle("sip_acct");
-        mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(sipAccount, "sip_acct")
+        registerAndEnableAccount(new PhoneAccount.Builder(sipAccount, "sip_acct")
                 .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
                 .addSupportedUriScheme(PhoneAccount.SCHEME_SIP)
                 .build());
@@ -206,7 +210,7 @@
 
         // Add a connection manager, make sure tel: doesn't change
         PhoneAccountHandle connectionManager = makeQuickAccountHandle("mgr_acct");
-        mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(connectionManager, "mgr_acct")
+        registerAndEnableAccount(new PhoneAccount.Builder(connectionManager, "mgr_acct")
                 .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                 .addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
                 .build());
@@ -276,6 +280,7 @@
                 .setIcon(Icon.createWithResource(
                             "com.android.server.telecom.tests", R.drawable.stat_sys_phone_call))
                 .setShortDescription("desc" + idx)
+                .setIsEnabled(true)
                 .build();
     }
 
@@ -311,7 +316,7 @@
             data = baos.toByteArray();
         }
 
-        Log.d(self, "====== XML data ======\n%s", new String(data));
+        Log.i(self, "====== XML data ======\n%s", new String(data));
 
         T result = null;
         {
@@ -321,7 +326,7 @@
             result = xml.readFromXml(parser, MAX_VERSION, context);
         }
 
-        Log.d(self, "result = " + result);
+        Log.i(self, "result = " + result);
 
         return result;
     }
@@ -338,17 +343,31 @@
         }
     }
 
+    private static void assertIconEquals(Icon a, Icon b) {
+        if (a != b) {
+            if (a != null && b != null) {
+                assertEquals(a.toString(), b.toString());
+            } else {
+                fail("Icons not equal: " + a + ", " + b);
+            }
+        }
+    }
+
     private static void assertPhoneAccountEquals(PhoneAccount a, PhoneAccount b) {
         if (a != b) {
-            assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
-            assertEquals(a.getAddress(), b.getAddress());
-            assertEquals(a.getSubscriptionAddress(), b.getSubscriptionAddress());
-            assertEquals(a.getCapabilities(), b.getCapabilities());
-            assertEquals(a.getIcon().toString(), b.getIcon().toString());
-            assertEquals(a.getHighlightColor(), b.getHighlightColor());
-            assertEquals(a.getLabel(), b.getLabel());
-            assertEquals(a.getShortDescription(), b.getShortDescription());
-            assertEquals(a.getSupportedUriSchemes(), b.getSupportedUriSchemes());
+            if (a != null && b != null) {
+                assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
+                assertEquals(a.getAddress(), b.getAddress());
+                assertEquals(a.getSubscriptionAddress(), b.getSubscriptionAddress());
+                assertEquals(a.getCapabilities(), b.getCapabilities());
+                assertIconEquals(a.getIcon(), b.getIcon());
+                assertEquals(a.getHighlightColor(), b.getHighlightColor());
+                assertEquals(a.getLabel(), b.getLabel());
+                assertEquals(a.getShortDescription(), b.getShortDescription());
+                assertEquals(a.getSupportedUriSchemes(), b.getSupportedUriSchemes());
+            } else {
+                fail("Phone accounts not equal: " + a + ", " + b);
+            }
         }
     }
 
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index b2ee6a2..ad48370 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -34,6 +34,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.telecom.Call;
 import android.telecom.ConnectionRequest;
 import android.telecom.DisconnectCause;
 import android.telecom.ParcelableCall;
@@ -43,10 +44,6 @@
 import android.telephony.TelephonyManager;
 
 import com.android.internal.telecom.IInCallAdapter;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.server.telecom.CallerInfoAsyncQueryFactory;
-import com.android.server.telecom.CallState;
 import com.android.server.telecom.CallsManager;
 import com.android.server.telecom.HeadsetMediaButton;
 import com.android.server.telecom.HeadsetMediaButtonFactory;
@@ -216,6 +213,9 @@
         mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA0);
         mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA1);
         mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountB0);
+
+        mTelecomSystem.getPhoneAccountRegistrar().setUserSelectedOutgoingPhoneAccount(
+                mPhoneAccountA0.getAccountHandle());
     }
 
     private void setupInCallServices() throws Exception {
@@ -263,6 +263,7 @@
                         newOutgoingCallIntent.capture(),
                         any(UserHandle.class),
                         anyString(),
+                        anyInt(),
                         newOutgoingCallReceiver.capture(),
                         any(Handler.class),
                         anyInt(),
@@ -394,20 +395,21 @@
         assertEquals(1, mInCallServiceFixtureX.mCallById.size());
         String callId = mInCallServiceFixtureX.mLatestCallId;
 
-        assertEquals(CallState.DIALING, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.DIALING, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_DIALING, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_DIALING, mInCallServiceFixtureY.getCall(callId).getState());
 
         mConnectionServiceFixtureA.sendSetActive(connectionId);
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
+
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
 
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(callId);;
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
 
         mConnectionServiceFixtureA.sendSetDisconnected(connectionId, DisconnectCause.LOCAL);
-        assertEquals(CallState.DISCONNECTED, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.DISCONNECTED, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureY.getCall(callId).getState());
     }
 
     // A simple incoming call, similar in scope to the previous test
@@ -423,20 +425,20 @@
         assertEquals(1, mInCallServiceFixtureX.mCallById.size());
         String callId = mInCallServiceFixtureX.mLatestCallId;
 
-        assertEquals(CallState.RINGING, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.RINGING, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_RINGING, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_RINGING, mInCallServiceFixtureY.getCall(callId).getState());
 
         mConnectionServiceFixtureA.sendSetActive(connectionId);
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
 
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(callId);;
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(callId).getState());
 
         mConnectionServiceFixtureA.sendSetDisconnected(connectionId, DisconnectCause.LOCAL);
-        assertEquals(CallState.DISCONNECTED, mInCallServiceFixtureX.getCall(callId).getState());
-        assertEquals(CallState.DISCONNECTED, mInCallServiceFixtureY.getCall(callId).getState());
+        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureX.getCall(callId).getState());
+        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureY.getCall(callId).getState());
     }
 
     public void testDeadlockOnOutgoingCall() throws Exception {
