diff --git a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
index 0b99dc6..cdc5dea 100644
--- a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
@@ -26,9 +26,9 @@
 import android.telecomm.GatewayInfo;
 import android.telecomm.PhoneAccount;
 import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 import android.telecomm.VideoCallProfile;
 import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
 /**
@@ -261,9 +261,9 @@
             return;
         }
         PhoneAccount extraAccount = src.getParcelableExtra(
-                TelephonyManager.EXTRA_ACCOUNT);
+                TelecommManager.EXTRA_PHONE_ACCOUNT);
         if (extraAccount != null) {
-            dst.putExtra(TelephonyManager.EXTRA_ACCOUNT, extraAccount);
+            dst.putExtra(TelecommManager.EXTRA_PHONE_ACCOUNT, extraAccount);
             Log.d(this, "Found and copied account extra to broadcast intent.");
         }
 
@@ -321,7 +321,7 @@
             return null;
         }
 
-        return intent.getParcelableExtra(TelephonyManager.EXTRA_ACCOUNT);
+        return intent.getParcelableExtra(TelecommManager.EXTRA_PHONE_ACCOUNT);
     }
 
     private void launchSystemDialer(Context context, Uri handle) {
diff --git a/src/com/android/telecomm/TelecommServiceImpl.java b/src/com/android/telecomm/TelecommServiceImpl.java
index f1ab6c0..9bf4987 100644
--- a/src/com/android/telecomm/TelecommServiceImpl.java
+++ b/src/com/android/telecomm/TelecommServiceImpl.java
@@ -29,13 +29,16 @@
 import android.phone.PhoneManager;
 import android.telecomm.CallState;
 import android.telecomm.PhoneAccount;
+import android.telecomm.PhoneAccountMetadata;
 import android.telecomm.TelecommManager;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.telecomm.ITelecommService;
-import com.google.android.collect.Lists;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Implementation of the ITelecomm interface.
@@ -135,60 +138,94 @@
     // Implementation of the ITelecommService interface.
     //
 
-    @Override
-    public List<PhoneAccount> getAccounts() {
+    private static Map<PhoneAccount, PhoneAccountMetadata> sMetadataByAccount = new HashMap<>();
+
+    static {
         // TODO (STOPSHIP): Static list of Accounts for testing and UX work only.
         ComponentName componentName = new ComponentName(
                 "com.android.telecomm",
                 TelecommServiceImpl.class.getName());  // This field is a no-op
         Context app = TelecommApp.getInstance();
 
-        return Lists.newArrayList(
+        PhoneAccount[] accounts = new PhoneAccount[] {
                 new PhoneAccount(
                         componentName,
                         "account0",
                         Uri.parse("tel:999-555-1212"),
-                        app.getString(R.string.test_account_0_label),
-                        app.getString(R.string.test_account_0_short_description),
-                        true,
-                        true),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account1",
                         Uri.parse("tel:333-111-2222"),
-                        app.getString(R.string.test_account_1_label),
-                        app.getString(R.string.test_account_1_short_description),
-                        true,
-                        false),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account2",
                         Uri.parse("mailto:two@example.com"),
-                        app.getString(R.string.test_account_2_label),
-                        app.getString(R.string.test_account_2_short_description),
-                        true,
-                        false),
+                        0),
                 new PhoneAccount(
                         componentName,
                         "account3",
                         Uri.parse("mailto:three@example.com"),
+                        0)
+        };
+
+        sMetadataByAccount.put(
+                accounts[0],
+                new PhoneAccountMetadata(
+                        accounts[0],
+                        0,
+                        app.getString(R.string.test_account_0_label),
+                        app.getString(R.string.test_account_0_short_description)));
+        sMetadataByAccount.put(
+                accounts[1],
+                new PhoneAccountMetadata(
+                        accounts[1],
+                        0,
+                        app.getString(R.string.test_account_1_label),
+                        app.getString(R.string.test_account_1_short_description)));
+        sMetadataByAccount.put(
+                accounts[2],
+                new PhoneAccountMetadata(
+                        accounts[2],
+                        0,
+                        app.getString(R.string.test_account_2_label),
+                        app.getString(R.string.test_account_2_short_description)));
+        sMetadataByAccount.put(
+                accounts[3],
+                new PhoneAccountMetadata(
+                        accounts[3],
+                        0,
                         app.getString(R.string.test_account_3_label),
-                        app.getString(R.string.test_account_3_short_description),
-                        true,
-                        false)
-        );
+                        app.getString(R.string.test_account_3_short_description)));
     }
 
     @Override
-    public void setEnabled(PhoneAccount account, boolean enabled) {
-        // Enforce MODIFY_PHONE_STATE ?
-        // TODO
+    public List<PhoneAccount> getEnabledPhoneAccounts() {
+        return new ArrayList<>(sMetadataByAccount.keySet());
     }
 
     @Override
-    public void setSystemDefault(PhoneAccount account) {
-        // Enforce MODIFY_PHONE_STATE ?
-        // TODO
+    public PhoneAccountMetadata getPhoneAccountMetadata(PhoneAccount account) {
+        return sMetadataByAccount.get(account);
+    }
+
+    @Override
+    public void registerPhoneAccount(PhoneAccount account, PhoneAccountMetadata metadata) {
+        enforceModifyPermissionOrCallingPackage(account.getComponentName().getPackageName());
+        // TODO(santoscordon) -- IMPLEMENT ...
+    }
+
+    @Override
+    public void unregisterPhoneAccount(PhoneAccount account) {
+        enforceModifyPermissionOrCallingPackage(account.getComponentName().getPackageName());
+        // TODO(santoscordon) -- IMPLEMENT ...
+    }
+
+    @Override
+    public void clearAccounts(String packageName) {
+        enforceModifyPermissionOrCallingPackage(packageName);
+        // TODO(santoscordon) -- IMPLEMENT ...
     }
 
     /**
@@ -334,6 +371,15 @@
         }
     }
 
+    private void enforceModifyPermissionOrCallingPackage(String packageName) {
+        // TODO(santoscordon): Use a new telecomm permission for this instead of reusing modify.
+        try {
+            enforceModifyPermission();
+        } catch (SecurityException e) {
+            enforceCallingPackage(packageName);
+        }
+    }
+
     private void enforceReadPermission() {
         TelecommApp.getInstance().enforceCallingOrSelfPermission(
                 android.Manifest.permission.READ_PHONE_STATE, null);
@@ -345,6 +391,10 @@
         }
     }
 
+    private void enforceCallingPackage(String packageName) {
+        mAppOpsManager.checkPackage(Binder.getCallingUid(), packageName);
+    }
+
     private void showCallScreenInternal(boolean showDialpad) {
         CallsManager.getInstance().getInCallController().bringToForeground(showDialpad);
     }
