diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 36eae30..79b754a 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -71,7 +71,7 @@
         void onFailedOutgoingCall(Call call, int errorCode, String errorMsg);
         void onSuccessfulIncomingCall(Call call);
         void onFailedIncomingCall(Call call);
-        void onRequestingRingback(Call call, boolean requestingRingback);
+        void onRingbackRequested(Call call, boolean ringbackRequested);
         void onPostDialWait(Call call, String remaining);
         void onCallCapabilitiesChanged(Call call);
         void onParentChanged(Call call);
@@ -79,7 +79,7 @@
         void onCannedSmsResponsesLoaded(Call call);
         void onVideoCallProviderChanged(Call call);
         void onCallerInfoChanged(Call call);
-        void onAudioModeIsVoipChanged(Call call);
+        void onIsVoipAudioModeChanged(Call call);
         void onStatusHintsChanged(Call call);
         void onHandleChanged(Call call);
         void onCallerDisplayNameChanged(Call call);
@@ -100,7 +100,7 @@
         @Override
         public void onFailedIncomingCall(Call call) {}
         @Override
-        public void onRequestingRingback(Call call, boolean requestingRingback) {}
+        public void onRingbackRequested(Call call, boolean ringbackRequested) {}
         @Override
         public void onPostDialWait(Call call, String remaining) {}
         @Override
@@ -116,7 +116,7 @@
         @Override
         public void onCallerInfoChanged(Call call) {}
         @Override
-        public void onAudioModeIsVoipChanged(Call call) {}
+        public void onIsVoipAudioModeChanged(Call call) {}
         @Override
         public void onStatusHintsChanged(Call call) {}
         @Override
@@ -260,7 +260,7 @@
     private int mQueryToken = 0;
 
     /** Whether this call is requesting that Telecomm play the ringback tone on its behalf. */
-    private boolean mRequestingRingback = false;
+    private boolean mRingbackRequested = false;
 
     /** Whether direct-to-voicemail query is pending. */
     private boolean mDirectToVoicemailQueryPending;
@@ -281,7 +281,7 @@
 
     private IVideoProvider mVideoProvider;
 
-    private boolean mAudioModeIsVoip;
+    private boolean mIsVoipAudioMode;
     private StatusHints mStatusHints;
     private final ConnectionServiceRepository mRepository;
 
@@ -361,15 +361,15 @@
         }
     }
 
-    void setRequestingRingback(boolean requestingRingback) {
-        mRequestingRingback = requestingRingback;
+    void setRingbackRequested(boolean ringbackRequested) {
+        mRingbackRequested = ringbackRequested;
         for (Listener l : mListeners) {
-            l.onRequestingRingback(this, mRequestingRingback);
+            l.onRingbackRequested(this, mRingbackRequested);
         }
     }
 
-    boolean isRequestingRingback() {
-        return mRequestingRingback;
+    boolean isRingbackRequested() {
+        return mRingbackRequested;
     }
 
     boolean isConference() {
@@ -632,8 +632,8 @@
         setCallCapabilities(connection.getCapabilities());
         setVideoProvider(connection.getVideoProvider());
         setVideoState(connection.getVideoState());
-        setRequestingRingback(connection.isRequestingRingback());
-        setAudioModeIsVoip(connection.getAudioModeIsVoip());
+        setRingbackRequested(connection.isRingbackRequested());
+        setIsVoipAudioMode(connection.getIsVoipAudioMode());
         setStatusHints(connection.getStatusHints());
 
         mConferenceableCalls.clear();
@@ -1190,14 +1190,14 @@
         }
     }
 
-    public boolean getAudioModeIsVoip() {
-        return mAudioModeIsVoip;
+    public boolean getIsVoipAudioMode() {
+        return mIsVoipAudioMode;
     }
 
-    public void setAudioModeIsVoip(boolean audioModeIsVoip) {
-        mAudioModeIsVoip = audioModeIsVoip;
+    public void setIsVoipAudioMode(boolean audioModeIsVoip) {
+        mIsVoipAudioMode = audioModeIsVoip;
         for (Listener l : mListeners) {
-            l.onAudioModeIsVoipChanged(this);
+            l.onIsVoipAudioModeChanged(this);
         }
     }
 
diff --git a/src/com/android/telecomm/CallAudioManager.java b/src/com/android/telecomm/CallAudioManager.java
index 164bedb..c02e96d 100644
--- a/src/com/android/telecomm/CallAudioManager.java
+++ b/src/com/android/telecomm/CallAudioManager.java
@@ -114,7 +114,7 @@
     }
 
     @Override
-    public void onAudioModeIsVoipChanged(Call call) {
+    public void onIsVoipAudioModeChanged(Call call) {
         updateAudioStreamAndMode();
     }
 
@@ -331,7 +331,7 @@
         } else {
             Call call = getForegroundCall();
             if (call != null) {
-                int mode = call.getAudioModeIsVoip() ?
+                int mode = call.getIsVoipAudioMode() ?
                         AudioManager.MODE_IN_COMMUNICATION : AudioManager.MODE_IN_CALL;
                 requestAudioFocusAndSetMode(AudioManager.STREAM_VOICE_CALL, mode);
             } else if (mIsTonePlaying) {
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 546c847..2be03c5 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -55,9 +55,9 @@
         void onIncomingCallRejected(Call call, boolean rejectWithMessage, String textMessage);
         void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall);
         void onAudioStateChanged(AudioState oldAudioState, AudioState newAudioState);
-        void onRequestingRingback(Call call, boolean ringback);
+        void onRingbackRequested(Call call, boolean ringback);
         void onIsConferencedChanged(Call call);
-        void onAudioModeIsVoipChanged(Call call);
+        void onIsVoipAudioModeChanged(Call call);
         void onVideoStateChanged(Call call);
     }
 
@@ -171,9 +171,9 @@
     }
 
     @Override
-    public void onRequestingRingback(Call call, boolean ringback) {
+    public void onRingbackRequested(Call call, boolean ringback) {
         for (CallsManagerListener listener : mListeners) {
-            listener.onRequestingRingback(call, ringback);
+            listener.onRingbackRequested(call, ringback);
         }
     }
 
@@ -197,9 +197,9 @@
     }
 
     @Override
-    public void onAudioModeIsVoipChanged(Call call) {
+    public void onIsVoipAudioModeChanged(Call call) {
         for (CallsManagerListener listener : mListeners) {
-            listener.onAudioModeIsVoipChanged(call);
+            listener.onIsVoipAudioModeChanged(call);
         }
     }
 
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index 65ce4ac..8437e29 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -59,7 +59,7 @@
     }
 
     @Override
-    public void onRequestingRingback(Call call, boolean ringback) {
+    public void onRingbackRequested(Call call, boolean ringback) {
     }
 
     @Override
@@ -67,7 +67,7 @@
     }
 
     @Override
-    public void onAudioModeIsVoipChanged(Call call) {
+    public void onIsVoipAudioModeChanged(Call call) {
     }
 
     @Override
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index 00037ed..5c678ff 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -28,12 +28,12 @@
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ConnectionService;
 import android.telecomm.GatewayInfo;
-
 import android.telecomm.ParcelableConference;
 import android.telecomm.ParcelableConnection;
 import android.telecomm.PhoneAccount;
 import android.telecomm.PhoneAccountHandle;
 import android.telecomm.StatusHints;
+import android.telecomm.TelecommManager;
 import android.telecomm.VideoProfile;
 import android.telephony.DisconnectCause;
 
@@ -65,7 +65,7 @@
     private static final int MSG_SET_DIALING = 4;
     private static final int MSG_SET_DISCONNECTED = 5;
     private static final int MSG_SET_ON_HOLD = 6;
-    private static final int MSG_SET_REQUESTING_RINGBACK = 7;
+    private static final int MSG_SET_RINGBACK_REQUESTED = 7;
     private static final int MSG_SET_CALL_CAPABILITIES = 8;
     private static final int MSG_SET_IS_CONFERENCED = 9;
     private static final int MSG_ADD_CONFERENCE_CALL = 10;
@@ -73,9 +73,9 @@
     private static final int MSG_ON_POST_DIAL_WAIT = 12;
     private static final int MSG_QUERY_REMOTE_CALL_SERVICES = 13;
     private static final int MSG_SET_VIDEO_PROVIDER = 14;
-    private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 15;
+    private static final int MSG_SET_IS_VOIP_AUDIO_MODE = 15;
     private static final int MSG_SET_STATUS_HINTS = 16;
-    private static final int MSG_SET_HANDLE = 17;
+    private static final int MSG_SET_ADDRESS = 17;
     private static final int MSG_SET_CALLER_DISPLAY_NAME = 18;
     private static final int MSG_SET_VIDEO_STATE = 19;
     private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20;
@@ -147,10 +147,10 @@
                         //Log.w(this, "setOnHold, unknown call id: %s", msg.obj);
                     }
                     break;
-                case MSG_SET_REQUESTING_RINGBACK: {
+                case MSG_SET_RINGBACK_REQUESTED: {
                     call = mCallIdMapper.getCall(msg.obj);
                     if (call != null) {
-                        call.setRequestingRingback(msg.arg1 == 1);
+                        call.setRingbackRequested(msg.arg1 == 1);
                     } else {
                         //Log.w(this, "setRingback, unknown call id: %s", args.arg1);
                     }
@@ -263,10 +263,10 @@
                     }
                     break;
                 }
-                case MSG_SET_AUDIO_MODE_IS_VOIP: {
+                case MSG_SET_IS_VOIP_AUDIO_MODE: {
                     call = mCallIdMapper.getCall(msg.obj);
                     if (call != null) {
-                        call.setAudioModeIsVoip(msg.arg1 == 1);
+                        call.setIsVoipAudioMode(msg.arg1 == 1);
                     }
                     break;
                 }
@@ -283,7 +283,7 @@
                     }
                     break;
                 }
-                case MSG_SET_HANDLE: {
+                case MSG_SET_ADDRESS: {
                     SomeArgs args = (SomeArgs) msg.obj;
                     try {
                         call = mCallIdMapper.getCall(args.arg1);
@@ -416,10 +416,10 @@
         }
 
         @Override
-        public void setRequestingRingback(String callId, boolean ringback) {
-            logIncoming("setRequestingRingback %s %b", callId, ringback);
+        public void setRingbackRequested(String callId, boolean ringback) {
+            logIncoming("setRingbackRequested %s %b", callId, ringback);
             if (mCallIdMapper.isValidCallId(callId)) {
-                mHandler.obtainMessage(MSG_SET_REQUESTING_RINGBACK, ringback ? 1 : 0, 0, callId)
+                mHandler.obtainMessage(MSG_SET_RINGBACK_REQUESTED, ringback ? 1 : 0, 0, callId)
                         .sendToTarget();
             }
         }
@@ -492,10 +492,10 @@
         }
 
         @Override
-        public void setAudioModeIsVoip(String callId, boolean isVoip) {
-            logIncoming("setAudioModeIsVoip %s %b", callId, isVoip);
+        public void setIsVoipAudioMode(String callId, boolean isVoip) {
+            logIncoming("setIsVoipAudioMode %s %b", callId, isVoip);
             if (mCallIdMapper.isValidCallId(callId)) {
-                mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, isVoip ? 1 : 0, 0,
+                mHandler.obtainMessage(MSG_SET_IS_VOIP_AUDIO_MODE, isVoip ? 1 : 0, 0,
                         callId).sendToTarget();
             }
         }
@@ -512,14 +512,14 @@
         }
 
         @Override
-        public void setHandle(String callId, Uri handle, int presentation) {
-            logIncoming("setHandle %s %s %d", callId, handle, presentation);
+        public void setAddress(String callId, Uri address, int presentation) {
+            logIncoming("setAddress %s %s %d", callId, address, presentation);
             if (mCallIdMapper.isValidCallId(callId)) {
                 SomeArgs args = SomeArgs.obtain();
                 args.arg1 = callId;
-                args.arg2 = handle;
+                args.arg2 = address;
                 args.argi1 = presentation;
-                mHandler.obtainMessage(MSG_SET_HANDLE, args).sendToTarget();
+                mHandler.obtainMessage(MSG_SET_ADDRESS, args).sendToTarget();
             }
         }
 
@@ -612,10 +612,10 @@
                         gatewayInfo.getOriginalAddress() != null) {
                     extras = (Bundle) extras.clone();
                     extras.putString(
-                            NewOutgoingCallIntentBroadcaster.EXTRA_GATEWAY_PROVIDER_PACKAGE,
+                            TelecommManager.GATEWAY_PROVIDER_PACKAGE,
                             gatewayInfo.getGatewayProviderPackageName());
                     extras.putParcelable(
-                            NewOutgoingCallIntentBroadcaster.EXTRA_GATEWAY_ORIGINAL_URI,
+                            TelecommManager.GATEWAY_ORIGINAL_ADDRESS,
                             gatewayInfo.getOriginalAddress());
                 }
 
diff --git a/src/com/android/telecomm/ProximitySensorManager.java b/src/com/android/telecomm/ProximitySensorManager.java
index 7b8773d..1fabd66 100644
--- a/src/com/android/telecomm/ProximitySensorManager.java
+++ b/src/com/android/telecomm/ProximitySensorManager.java
@@ -79,7 +79,7 @@
         if (mProximityWakeLock.isHeld()) {
             Log.i(this, "Releasing proximity wake lock");
             int flags =
-                (screenOnImmediately ? 0 : PowerManager.WAIT_FOR_DISTANT_PROXIMITY);
+                (screenOnImmediately ? 0 : PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
             mProximityWakeLock.release(flags);
         } else {
             Log.i(this, "Proximity wake lock already released");
diff --git a/src/com/android/telecomm/RingbackPlayer.java b/src/com/android/telecomm/RingbackPlayer.java
index bfd5f62..645844a 100644
--- a/src/com/android/telecomm/RingbackPlayer.java
+++ b/src/com/android/telecomm/RingbackPlayer.java
@@ -74,7 +74,7 @@
     }
 
     @Override
-    public void onRequestingRingback(Call call, boolean ignored) {
+    public void onRingbackRequested(Call call, boolean ignored) {
         if (shouldStartRinging(call)) {
             startRingbackForCall(call);
         } else {
@@ -137,6 +137,6 @@
         return call != null
                 && mCallsManager.getForegroundCall() == call
                 && call.getState() == CallState.DIALING
-                && call.isRequestingRingback();
+                && call.isRingbackRequested();
     }
 }
diff --git a/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java b/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
index 59047da..54cbe74 100644
--- a/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
+++ b/tests/src/com/android/telecomm/testapps/CallServiceNotifier.java
@@ -97,7 +97,7 @@
         TelecommManager telecommManager =
                 (TelecommManager) context.getSystemService(Context.TELECOMM_SERVICE);
 
-        telecommManager.clearAccounts(context.getPackageName());
+        telecommManager.clearAccounts();
 
         telecommManager.registerPhoneAccount(PhoneAccount.builder(
                         new PhoneAccountHandle(
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
index c34485a..256d119 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionManager.java
@@ -40,7 +40,7 @@
  */
 public class TestConnectionManager extends ConnectionService {
     public final class TestManagedConnection extends Connection {
-        private final RemoteConnection.Listener mRemoteListener = new RemoteConnection.Listener() {
+        private final RemoteConnection.Callback mRemoteCallback = new RemoteConnection.Callback() {
             @Override
             public void onStateChanged(RemoteConnection connection, int state) {
                 setState(state);
@@ -53,8 +53,8 @@
             }
 
             @Override
-            public void onRequestingRingback(RemoteConnection connection, boolean ringback) {
-                setRequestingRingback(ringback);
+            public void onRingbackRequested(RemoteConnection connection, boolean ringback) {
+                setRingbackRequested(ringback);
             }
 
             @Override
@@ -69,7 +69,7 @@
             }
 
             @Override
-            public void onAudioModeIsVoipChanged(RemoteConnection connection, boolean isVoip) {
+            public void onVoipAudioChanged(RemoteConnection connection, boolean isVoip) {
                 setAudioModeIsVoip(isVoip);
             }
 
@@ -87,8 +87,9 @@
             }
 
             @Override
-            public void onHandleChanged(RemoteConnection connection, Uri handle, int presentation) {
-                setHandle(handle, presentation);
+            public void onAddressChanged(
+                    RemoteConnection connection, Uri address, int presentation) {
+                setAddress(address, presentation);
             }
 
             @Override
@@ -123,7 +124,7 @@
         TestManagedConnection(RemoteConnection remote, boolean isIncoming) {
             mRemote = remote;
             mIsIncoming = isIncoming;
-            mRemote.addListener(mRemoteListener);
+            mRemote.registerCallback(mRemoteCallback);
             setState(mRemote.getState());
             setVideoState(mRemote.getVideoState());
         }
@@ -249,7 +250,7 @@
             @Override
             public void onDestroyed(RemoteConference conference) {
                 destroy();
-                mRemote.removeCallback(mRemoteCallback);
+                mRemote.unregisterCallback(mRemoteCallback);
                 mManagedConferenceByRemote.remove(mRemote);
             }
         };
@@ -259,7 +260,7 @@
         public TestManagedConference(RemoteConference remote) {
             super(null);
             mRemote = remote;
-            remote.addCallback(mRemoteCallback);
+            remote.registerCallback(mRemoteCallback);
             setActive();
             for (RemoteConnection r : remote.getConnections()) {
                 TestManagedConnection c = mManagedConnectionByRemote.get(r);
diff --git a/tests/src/com/android/telecomm/testapps/TestConnectionService.java b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
index 186bb5e..d35d789 100644
--- a/tests/src/com/android/telecomm/testapps/TestConnectionService.java
+++ b/tests/src/com/android/telecomm/testapps/TestConnectionService.java
@@ -51,11 +51,6 @@
  * TODO: Rename all classes in the directory to Dummy* (e.g., DummyConnectionService).
  */
 public class TestConnectionService extends ConnectionService {
-    public static final String EXTRA_GATEWAY_PROVIDER_PACKAGE =
-            "com.android.phone.extra.GATEWAY_PROVIDER_PACKAGE";
-    public static final String EXTRA_GATEWAY_ORIGINAL_URI =
-            "com.android.phone.extra.GATEWAY_ORIGINAL_URI";
-
     /**
      * Intent extra used to pass along whether a call is video or audio based on the user's choice
      * in the notification.
@@ -267,8 +262,8 @@
         }
 
         Bundle extras = originalRequest.getExtras();
-        String gatewayPackage = extras.getString(EXTRA_GATEWAY_PROVIDER_PACKAGE);
-        Uri originalHandle = extras.getParcelable(EXTRA_GATEWAY_ORIGINAL_URI);
+        String gatewayPackage = extras.getString(TelecommManager.GATEWAY_PROVIDER_PACKAGE);
+        Uri originalHandle = extras.getParcelable(TelecommManager.GATEWAY_ORIGINAL_ADDRESS);
 
         log("gateway package [" + gatewayPackage + "], original handle [" +
                 originalHandle + "]");
@@ -315,8 +310,9 @@
             Uri providedHandle = extras.getParcelable(EXTRA_HANDLE);
 
             // Use dummy number for testing incoming calls.
-            Uri handle = providedHandle == null ?
-                    Uri.fromParts(PhoneAccount.SCHEME_TEL, getDummyNumber(isVideoCall), null) : providedHandle;
+            Uri address = providedHandle == null ?
+                    Uri.fromParts(PhoneAccount.SCHEME_TEL, getDummyNumber(isVideoCall), null)
+                    : providedHandle;
             if (isVideoCall) {
                 TestVideoProvider testVideoCallProvider =
                         new TestVideoProvider(getApplicationContext());
@@ -330,13 +326,13 @@
                     VideoProfile.VideoState.BIDIRECTIONAL :
                     VideoProfile.VideoState.AUDIO_ONLY;
             connection.setVideoState(videoState);
-            connection.setHandle(handle, TelecommManager.PRESENTATION_ALLOWED);
+            connection.setAddress(address, TelecommManager.PRESENTATION_ALLOWED);
 
             addCall(connection);
 
             ConnectionRequest newRequest = new ConnectionRequest(
                     request.getAccountHandle(),
-                    handle,
+                    address,
                     request.getExtras(),
                     videoState);
             connection.setVideoState(videoState);
