diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index c2e0d0f..52f44f1 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -22,7 +22,6 @@
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CameraProperties;
-import android.os.Handler;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
@@ -63,8 +62,8 @@
 
     public void testCameraManagerGetDeviceIdList() throws Exception {
 
-        // Test: that the getCameraIdList method runs without exceptions.
-        String[] ids = mCameraManager.getCameraIdList();
+        // Test: that the getDeviceIdList method runs without exceptions.
+        String[] ids = mCameraManager.getDeviceIdList();
         if (VERBOSE) Log.v(TAG, "CameraManager ids: " + Arrays.toString(ids));
 
         // Test: that if the device has a camera, there must be at least one reported id.
@@ -96,7 +95,7 @@
 
     // Test: that properties can be queried from each device, without exceptions.
     public void testCameraManagerGetCameraProperties() throws Exception {
-        String[] ids = mCameraManager.getCameraIdList();
+        String[] ids = mCameraManager.getDeviceIdList();
         for (int i = 0; i < ids.length; i++) {
             CameraDevice camera = mCameraManager.openCamera(ids[i]);
             assertNotNull(
@@ -114,7 +113,7 @@
 
     // Test: that an exception is thrown if an invalid device id is passed down.
     public void testCameraManagerInvalidDevice() throws Exception {
-        String[] ids = mCameraManager.getCameraIdList();
+        String[] ids = mCameraManager.getDeviceIdList();
         // Create an invalid id by concatenating all the valid ids together.
         StringBuilder invalidId = new StringBuilder();
         invalidId.append("INVALID");
@@ -133,7 +132,7 @@
 
     // Test: that each camera device can be opened one at a time, several times.
     public void testCameraManagerOpenCamerasSerially() throws Exception {
-        String[] ids = mCameraManager.getCameraIdList();
+        String[] ids = mCameraManager.getDeviceIdList();
         for (int i = 0; i < ids.length; i++) {
             for (int j = 0; j < NUM_CAMERA_REOPENS; j++) {
                 CameraDevice camera = mCameraManager.openCamera(ids[i]);
@@ -149,7 +148,7 @@
      * exception is thrown if this can't be done.
      */
     public void testCameraManagerOpenAllCameras() throws Exception {
-        String[] ids = mCameraManager.getCameraIdList();
+        String[] ids = mCameraManager.getDeviceIdList();
         CameraDevice[] cameras = new CameraDevice[ids.length];
         try {
             for (int i = 0; i < ids.length; i++) {
@@ -186,7 +185,7 @@
 
     // Test: that opening the same device multiple times throws the right exception.
     public void testCameraManagerOpenCameraTwice() throws Exception {
-        String[] ids = mCameraManager.getCameraIdList();
+        String[] ids = mCameraManager.getDeviceIdList();
         CameraDevice[] cameras = new CameraDevice[2];
         if (ids.length > 0) {
             try {
@@ -219,7 +218,7 @@
         }
     }
 
-    private class NoopCameraListener extends CameraManager.AvailabilityListener {
+    private class NoopCameraListener implements CameraManager.CameraListener {
         @Override
         public void onCameraAvailable(String cameraId) {
             // No-op
@@ -238,13 +237,11 @@
      * a listener that isn't registered should have no effect.
      */
     public void testCameraManagerListener() throws Exception {
-        CameraTestThread callbackThread = new CameraTestThread();
-        Handler callbackHandler = callbackThread.start();
-
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.addAvailabilityListener(mListener, callbackHandler);
-        mCameraManager.addAvailabilityListener(mListener, callbackHandler);
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.removeAvailabilityListener(mListener);
+        mCameraManager.unregisterCameraListener(mListener);
+        mCameraManager.registerCameraListener(mListener);
+        mCameraManager.registerCameraListener(mListener);
+        mCameraManager.unregisterCameraListener(mListener);
+        mCameraManager.unregisterCameraListener(mListener);
     }
 }
+
