diff --git a/src/com/android/telecomm/CallActivity.java b/src/com/android/telecomm/CallActivity.java
index 0f625c7..04a9ff1 100644
--- a/src/com/android/telecomm/CallActivity.java
+++ b/src/com/android/telecomm/CallActivity.java
@@ -21,7 +21,7 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.telecomm.PhoneAccount;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 
 /**
  * Activity that handles system CALL actions and forwards them to {@link CallsManager}.
@@ -79,7 +79,7 @@
                 Intent.ACTION_CALL_PRIVILEGED.equals(action) ||
                 Intent.ACTION_CALL_EMERGENCY.equals(action)) {
             processOutgoingCallIntent(intent);
-        } else if (TelecommConstants.ACTION_INCOMING_CALL.equals(action)) {
+        } else if (TelecommManager.ACTION_INCOMING_CALL.equals(action)) {
             processIncomingCallIntent(intent);
         }
     }
@@ -103,7 +103,7 @@
      */
     private void processIncomingCallIntent(Intent intent) {
         PhoneAccount phoneAccount = intent.getParcelableExtra(
-                TelecommConstants.EXTRA_PHONE_ACCOUNT);
+                TelecommManager.EXTRA_PHONE_ACCOUNT);
         if (phoneAccount == null) {
             Log.w(this, "Rejecting incoming call due to null phone account");
             return;
@@ -114,8 +114,8 @@
         }
 
         Bundle clientExtras = null;
-        if (intent.hasExtra(TelecommConstants.EXTRA_INCOMING_CALL_EXTRAS)) {
-            clientExtras = intent.getBundleExtra(TelecommConstants.EXTRA_INCOMING_CALL_EXTRAS);
+        if (intent.hasExtra(TelecommManager.EXTRA_INCOMING_CALL_EXTRAS)) {
+            clientExtras = intent.getBundleExtra(TelecommManager.EXTRA_INCOMING_CALL_EXTRAS);
         }
         if (clientExtras == null) {
             clientExtras = Bundle.EMPTY;
diff --git a/src/com/android/telecomm/ConnectionServiceRepository.java b/src/com/android/telecomm/ConnectionServiceRepository.java
index 598bdd1..48b0ebb 100644
--- a/src/com/android/telecomm/ConnectionServiceRepository.java
+++ b/src/com/android/telecomm/ConnectionServiceRepository.java
@@ -21,7 +21,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,7 +40,7 @@
 
     Collection<ConnectionServiceWrapper> lookupServices() {
         PackageManager packageManager = TelecommApp.getInstance().getPackageManager();
-        Intent intent = new Intent(TelecommConstants.ACTION_CONNECTION_SERVICE);
+        Intent intent = new Intent(TelecommManager.ACTION_CONNECTION_SERVICE);
         ArrayList<ConnectionServiceWrapper> services = new ArrayList<>();
 
         for (ResolveInfo entry : packageManager.queryIntentServices(intent, 0)) {
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index eb2e0ac..09ddeb0 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -29,7 +29,7 @@
 import android.telecomm.ConnectionRequest;
 import android.telecomm.GatewayInfo;
 import android.telecomm.StatusHints;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 import android.telephony.DisconnectCause;
 
 import com.android.internal.os.SomeArgs;
@@ -38,7 +38,6 @@
 import com.android.internal.telecomm.ICallVideoProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
 import org.apache.http.conn.ClientConnectionRequest;
 
@@ -533,7 +532,7 @@
      */
     ConnectionServiceWrapper(
             ComponentName componentName, ConnectionServiceRepository connectionServiceRepository) {
-        super(TelecommConstants.ACTION_CONNECTION_SERVICE, componentName);
+        super(TelecommManager.ACTION_CONNECTION_SERVICE, componentName);
         mConnectionServiceRepository = connectionServiceRepository;
     }
 
diff --git a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
index a83afaf..2dee24f 100644
--- a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
@@ -25,7 +25,7 @@
 import android.os.UserHandle;
 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.text.TextUtils;
@@ -118,9 +118,9 @@
             GatewayInfo gatewayInfo = getGateWayInfoFromIntent(intent, resultHandleUri);
             PhoneAccount account = getAccountFromIntent(intent);
             mCallsManager.placeOutgoingCall(resultHandleUri, gatewayInfo, account,
-                    mIntent.getBooleanExtra(TelecommConstants.EXTRA_START_CALL_WITH_SPEAKERPHONE,
+                    mIntent.getBooleanExtra(TelecommManager.EXTRA_START_CALL_WITH_SPEAKERPHONE,
                             false),
-                    mIntent.getIntExtra(TelecommConstants.EXTRA_START_CALL_WITH_VIDEO_STATE,
+                    mIntent.getIntExtra(TelecommManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
                             VideoCallProfile.VIDEO_STATE_AUDIO_ONLY));
         }
     }
@@ -188,9 +188,9 @@
                     + " OutgoingCallBroadcastReceiver: %s", intent);
             String scheme = isUriNumber ? SCHEME_SIP : SCHEME_TEL;
             boolean speakerphoneOn = mIntent.getBooleanExtra(
-                    TelecommConstants.EXTRA_START_CALL_WITH_SPEAKERPHONE, false);
+                    TelecommManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false);
             int videoState = mIntent.getIntExtra(
-                    TelecommConstants.EXTRA_START_CALL_WITH_VIDEO_STATE,
+                    TelecommManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
                     VideoCallProfile.VIDEO_STATE_AUDIO_ONLY);
             mCallsManager.placeOutgoingCall(
                     Uri.fromParts(scheme, handle, null), null, null, speakerphoneOn, videoState);
@@ -261,9 +261,9 @@
             Log.d(this, "Found and copied gateway provider extras to broadcast intent.");
             return;
         }
-        PhoneAccount extraAccount = src.getParcelableExtra(TelecommConstants.EXTRA_PHONE_ACCOUNT);
+        PhoneAccount extraAccount = src.getParcelableExtra(TelecommManager.EXTRA_PHONE_ACCOUNT);
         if (extraAccount != null) {
-            dst.putExtra(TelecommConstants.EXTRA_PHONE_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(TelecommConstants.EXTRA_PHONE_ACCOUNT);
+        return intent.getParcelableExtra(TelecommManager.EXTRA_PHONE_ACCOUNT);
     }
 
     private void launchSystemDialer(Context context, Uri handle) {
diff --git a/src/com/android/telecomm/PhoneStateBroadcaster.java b/src/com/android/telecomm/PhoneStateBroadcaster.java
index 4dee4bb..7aab729 100644
--- a/src/com/android/telecomm/PhoneStateBroadcaster.java
+++ b/src/com/android/telecomm/PhoneStateBroadcaster.java
@@ -19,8 +19,7 @@
 import android.Manifest;
 import android.content.Intent;
 import android.telecomm.CallState;
-import android.telecomm.ConnectionService;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 import android.telephony.DisconnectCause;
 import android.telephony.TelephonyManager;
 
@@ -71,7 +70,7 @@
         ConnectionServiceWrapper connectionService = call.getConnectionService();
         if (connectionService != null) {
             intent.putExtra(
-                    TelecommConstants.EXTRA_CONNECTION_SERVICE,
+                    TelecommManager.EXTRA_CONNECTION_SERVICE,
                     connectionService.getComponentName());
         }
 
@@ -79,13 +78,13 @@
         int disconnectCause = call.getDisconnectCause();
         String disconnectMessage = call.getDisconnectMessage();
         if (disconnectCause != DisconnectCause.NOT_VALID) {
-            intent.putExtra(TelecommConstants.EXTRA_CALL_DISCONNECT_CAUSE, disconnectCause);
+            intent.putExtra(TelecommManager.EXTRA_CALL_DISCONNECT_CAUSE, disconnectCause);
             if (disconnectMessage == null) {
                 disconnectMessage = DisconnectCause.toString(disconnectCause);
             }
         }
         if (disconnectMessage != null) {
-            intent.putExtra(TelecommConstants.EXTRA_CALL_DISCONNECT_MESSAGE,
+            intent.putExtra(TelecommManager.EXTRA_CALL_DISCONNECT_MESSAGE,
                     call.getDisconnectMessage());
         }
 
diff --git a/src/com/android/telecomm/TtyManager.java b/src/com/android/telecomm/TtyManager.java
index 61cd6d0..9dd8a6f 100644
--- a/src/com/android/telecomm/TtyManager.java
+++ b/src/com/android/telecomm/TtyManager.java
@@ -23,14 +23,14 @@
 import android.media.AudioManager;
 import android.os.UserHandle;
 import android.provider.Settings;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 
 final class TtyManager implements WiredHeadsetManager.Listener {
     private final TtyBroadcastReceiver mReceiver = new TtyBroadcastReceiver();
     private final Context mContext;
     private final WiredHeadsetManager mWiredHeadsetManager;
-    private int mPreferredTtyMode = TelecommConstants.TTY_MODE_OFF;
-    private int mCurrentTtyMode = TelecommConstants.TTY_MODE_OFF;
+    private int mPreferredTtyMode = TelecommManager.TTY_MODE_OFF;
+    private int mCurrentTtyMode = TelecommManager.TTY_MODE_OFF;
 
     TtyManager(Context context, WiredHeadsetManager wiredHeadsetManager) {
         mContext = context;
@@ -40,10 +40,10 @@
         mPreferredTtyMode = Settings.Secure.getInt(
                 mContext.getContentResolver(),
                 Settings.Secure.PREFERRED_TTY_MODE,
-                TelecommConstants.TTY_MODE_OFF);
+                TelecommManager.TTY_MODE_OFF);
 
         IntentFilter intentFilter = new IntentFilter(
-                TelecommConstants.ACTION_TTY_PREFERRED_MODE_CHANGED);
+                TelecommManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
         mContext.registerReceiver(mReceiver, intentFilter);
 
         updateCurrentTtyMode();
@@ -66,7 +66,7 @@
     }
 
     private void updateCurrentTtyMode() {
-        int newTtyMode = TelecommConstants.TTY_MODE_OFF;
+        int newTtyMode = TelecommManager.TTY_MODE_OFF;
         if (isTtySupported() && mWiredHeadsetManager.isPluggedIn()) {
             newTtyMode = mPreferredTtyMode;
         }
@@ -74,8 +74,8 @@
 
         if (mCurrentTtyMode != newTtyMode) {
             mCurrentTtyMode = newTtyMode;
-            Intent ttyModeChanged = new Intent(TelecommConstants.ACTION_CURRENT_TTY_MODE_CHANGED);
-            ttyModeChanged.putExtra(TelecommConstants.EXTRA_CURRENT_TTY_MODE, mCurrentTtyMode);
+            Intent ttyModeChanged = new Intent(TelecommManager.ACTION_CURRENT_TTY_MODE_CHANGED);
+            ttyModeChanged.putExtra(TelecommManager.EXTRA_CURRENT_TTY_MODE, mCurrentTtyMode);
             mContext.sendBroadcastAsUser(ttyModeChanged, UserHandle.ALL);
 
             updateAudioTtyMode();
@@ -85,16 +85,16 @@
     private void updateAudioTtyMode() {
         String audioTtyMode;
         switch (mCurrentTtyMode) {
-            case TelecommConstants.TTY_MODE_FULL:
+            case TTY_MODE_FULL:
                 audioTtyMode = "tty_full";
                 break;
-            case TelecommConstants.TTY_MODE_VCO:
+            case TTY_MODE_VCO:
                 audioTtyMode = "tty_vco";
                 break;
-            case TelecommConstants.TTY_MODE_HCO:
+            case TTY_MODE_HCO:
                 audioTtyMode = "tty_hco";
                 break;
-            case TelecommConstants.TTY_MODE_OFF:
+            case TTY_MODE_OFF:
             default:
                 audioTtyMode = "tty_off";
                 break;
@@ -110,9 +110,9 @@
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             Log.v(TtyManager.this, "onReceive, action: %s", action);
-            if (action.equals(TelecommConstants.ACTION_TTY_PREFERRED_MODE_CHANGED)) {
+            if (action.equals(TelecommManager.ACTION_TTY_PREFERRED_MODE_CHANGED)) {
                 int newPreferredTtyMode = intent.getIntExtra(
-                        TelecommConstants.EXTRA_TTY_PREFERRED_MODE, TelecommConstants.TTY_MODE_OFF);
+                        TelecommManager.EXTRA_TTY_PREFERRED_MODE, TelecommManager.TTY_MODE_OFF);
                 if (mPreferredTtyMode != newPreferredTtyMode) {
                     mPreferredTtyMode = newPreferredTtyMode;
                     updateCurrentTtyMode();
diff --git a/tests/src/com/android/telecomm/testapps/CallNotificationReceiver.java b/tests/src/com/android/telecomm/testapps/CallNotificationReceiver.java
index 7002354..1472444 100644
--- a/tests/src/com/android/telecomm/testapps/CallNotificationReceiver.java
+++ b/tests/src/com/android/telecomm/testapps/CallNotificationReceiver.java
@@ -22,8 +22,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.telecomm.PhoneAccount;
-import android.telecomm.PhoneAccountMetadata;
-import android.telecomm.TelecommConstants;
+import android.telecomm.TelecommManager;
 
 /**
  * This class receives the notification callback intents used to update call states for
@@ -70,7 +69,7 @@
      */
     private void sendIncomingCallIntent(Context context, boolean isVideoCall) {
         // Create intent for adding an incoming call.
-        Intent intent = new Intent(TelecommConstants.ACTION_INCOMING_CALL);
+        Intent intent = new Intent(TelecommManager.ACTION_INCOMING_CALL);
         // TODO(santoscordon): Use a private @hide permission to make sure this only goes to
         // Telecomm instead of setting the package explicitly.
         intent.setPackage("com.android.telecomm");
@@ -78,14 +77,14 @@
         PhoneAccount phoneAccount = new PhoneAccount(
                 new ComponentName(context, TestConnectionService.class),
                 null /* id */);
-        intent.putExtra(TelecommConstants.EXTRA_PHONE_ACCOUNT, phoneAccount);
+        intent.putExtra(TelecommManager.EXTRA_PHONE_ACCOUNT, phoneAccount);
 
         // For the purposes of testing, indicate whether the incoming call is a video call by
         // stashing an indicator in the EXTRA_INCOMING_CALL_EXTRAS.
         Bundle extras = new Bundle();
         extras.putBoolean(TestConnectionService.IS_VIDEO_CALL, isVideoCall);
 
-        intent.putExtra(TelecommConstants.EXTRA_INCOMING_CALL_EXTRAS, extras);
+        intent.putExtra(TelecommManager.EXTRA_INCOMING_CALL_EXTRAS, extras);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent);
     }
