diff --git a/tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java b/tests/tests/media/src/android/media/cts/AudioRecordingConfigurationTest.java
similarity index 93%
rename from tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java
rename to tests/tests/media/src/android/media/cts/AudioRecordingConfigurationTest.java
index 6a29aed..28d873c 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordingConfigurationTest.java
@@ -22,13 +22,13 @@
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioRecord;
-import android.media.AudioRecordConfiguration;
+import android.media.AudioRecordingConfiguration;
 import android.media.MediaRecorder;
 import android.os.Looper;
 import android.util.Log;
 
-public class AudioRecordNotificationTest extends CtsAndroidTestCase {
-    private final static String TAG = "AudioRecordNotificationTest";
+public class AudioRecordingConfigurationTest extends CtsAndroidTestCase {
+    private final static String TAG = "AudioRecordingConfigurationTest";
 
     private final static int TEST_SAMPLE_RATE = 16000;
     private final static int TEST_AUDIO_SOURCE = MediaRecorder.AudioSource.VOICE_RECOGNITION;
@@ -97,7 +97,7 @@
         AudioManager am = new AudioManager(getContext());
         assertNotNull("Could not create AudioManager", am);
 
-        AudioRecordConfiguration[] configs = am.getActiveRecordConfigurations();
+        AudioRecordingConfiguration[] configs = am.getActiveRecordingConfigurations();
         assertNotNull("Invalid null array of record configurations before recording", configs);
 
         assertEquals(AudioRecord.STATE_INITIALIZED, mAudioRecord.getState());
@@ -106,7 +106,7 @@
         Thread.sleep(TEST_TIMING_TOLERANCE_MS);
 
         // recording is active, verify there is an active record configuration
-        configs = am.getActiveRecordConfigurations();
+        configs = am.getActiveRecordingConfigurations();
         assertNotNull("Invalid null array of record configurations during recording", configs);
         assertTrue("no active record configurations (empty array) during recording",
                 configs.length > 0);
@@ -120,7 +120,7 @@
         // stopping recording: verify there are less active record configurations
         mAudioRecord.stop();
         Thread.sleep(TEST_TIMING_TOLERANCE_MS);
-        configs = am.getActiveRecordConfigurations();
+        configs = am.getActiveRecordingConfigurations();
         assertTrue("end of recording not reported in record configs",
                 configs.length < nbConfigsDuringRecording);
     }
@@ -178,7 +178,7 @@
         }
 
         @Override
-        public void onRecordConfigChanged(AudioRecordConfiguration[] configs) {
+        public void onRecordConfigChanged(AudioRecordingConfiguration[] configs) {
             mCalled = true;
             mParamMatch = verifyAudioConfig(mTestSource, mTestSession, mAudioRecord.getFormat(),
                     mAudioRecord.getRoutedDevice(), configs);
@@ -192,7 +192,7 @@
     }
 
     private static boolean verifyAudioConfig(int source, int session, AudioFormat format,
-            AudioDeviceInfo device, AudioRecordConfiguration[] configs) {
+            AudioDeviceInfo device, AudioRecordingConfiguration[] configs) {
         for (int i = 0 ; i < configs.length ; i++) {
             if ((configs[i].getClientAudioSource() == source)
                     && (configs[i].getClientAudioSessionId() == session)
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index e311cc7..980398d 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -39,12 +39,12 @@
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver.OnDrawListener;
 import android.view.animation.LayoutAnimationController;
-import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
+import android.widget.cts.util.ViewTestUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -129,24 +129,19 @@
     }
 
     private void setAdapter(final ArrayAdapter<String> adapter) {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(adapter);
             }
         });
-        mInstrumentation.waitForIdleSync();
     }
 
     public void testAccessDividerHeight() {
-        final HasDrawnListener drawListener = new HasDrawnListener();
-
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
-                mListView.getViewTreeObserver().addOnDrawListener(drawListener);
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         Drawable d = mListView.getDivider();
         final Rect r = d.getBounds();
@@ -157,46 +152,25 @@
             }
         }.run();
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
-                drawListener.reset();
                 mListView.setDividerHeight(20);
             }
         });
-        mInstrumentation.waitForIdleSync();
-        assertTrue(drawListener.hasDrawn());
+
         assertEquals(20, mListView.getDividerHeight());
         assertEquals(20, r.bottom - r.top);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
-                drawListener.reset();
                 mListView.setDividerHeight(10);
             }
         });
-        mInstrumentation.waitForIdleSync();
-        assertTrue(drawListener.hasDrawn());
+
         assertEquals(10, mListView.getDividerHeight());
         assertEquals(10, r.bottom - r.top);
     }
 
-    static class HasDrawnListener implements OnDrawListener {
-        private boolean mHasDrawn;
-
-        @Override
-        public void onDraw() {
-            mHasDrawn = true;
-        }
-
-        public boolean hasDrawn() {
-            return mHasDrawn;
-        }
-
-        public void reset() {
-            mHasDrawn = false;
-        }
-    }
-
     public void testAccessItemsCanFocus() {
         mListView.setItemsCanFocus(true);
         assertTrue(mListView.getItemsCanFocus());
@@ -208,22 +182,20 @@
     }
 
     public void testAccessAdapter() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         assertSame(mAdapter_countries, mListView.getAdapter());
         assertEquals(mCountryList.length, mListView.getCount());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_names);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         assertSame(mAdapter_names, mListView.getAdapter());
         assertEquals(mNameList.length, mListView.getCount());
@@ -313,7 +285,6 @@
                 mListView.setFooterDividersEnabled(true);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(0, mListView.getFooterViewsCount());
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -321,7 +292,6 @@
                 mListView.addFooterView(footerView1, null, true);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(1, mListView.getFooterViewsCount());
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -333,27 +303,24 @@
         mInstrumentation.waitForIdleSync();
         assertEquals(2, mListView.getFooterViewsCount());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.removeFooterView(footerView1);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(1, mListView.getFooterViewsCount());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.removeFooterView(footerView2);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(0, mListView.getFooterViewsCount());
     }
 
@@ -366,7 +333,6 @@
                 mListView.setHeaderDividersEnabled(true);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(0, mListView.getHeaderViewsCount());
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -374,7 +340,6 @@
                 mListView.addHeaderView(headerView2, null, true);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(1, mListView.getHeaderViewsCount());
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -382,7 +347,6 @@
                 mListView.addHeaderView(headerView1);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(2, mListView.getHeaderViewsCount());
     }
 
@@ -414,32 +378,29 @@
                 return super.getCount() + 1;
             }
         };
-        runTestOnUiThread(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             @Override
             public void run() {
                 mListView.setAdapter(adapter);
             }
         });
-        getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             @Override
             public void run() {
                 adapter.notifyDataSetChanged();
             }
         });
-        getInstrumentation().waitForIdleSync();
 
         assertEquals(0, mismatch.size());
     }
 
     public void testAccessDivider() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         Drawable defaultDrawable = mListView.getDivider();
         final Rect r = defaultDrawable.getBounds();
@@ -452,57 +413,51 @@
 
         final Drawable d = mActivity.getResources().getDrawable(R.drawable.scenery);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setDivider(d);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertSame(d, mListView.getDivider());
         assertEquals(d.getBounds().height(), mListView.getDividerHeight());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setDividerHeight(10);
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertEquals(10, mListView.getDividerHeight());
         assertEquals(10, d.getBounds().height());
     }
 
     public void testSetSelection() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setSelection(1);
             }
         });
-        mInstrumentation.waitForIdleSync();
         String item = (String) mListView.getSelectedItem();
         assertEquals(mCountryList[1], item);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setSelectionFromTop(5, 0);
             }
         });
-        mInstrumentation.waitForIdleSync();
         item = (String) mListView.getSelectedItem();
         assertEquals(mCountryList[5], item);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setSelectionAfterHeaderView();
             }
         });
-        mInstrumentation.waitForIdleSync();
         item = (String) mListView.getSelectedItem();
         assertEquals(mCountryList[0], item);
     }
@@ -512,20 +467,18 @@
     }
 
     public void testPerformItemClick() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setSelection(2);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         final TextView child = (TextView) mAdapter_countries.getView(2, null, mListView);
         assertNotNull(child);
@@ -564,33 +517,30 @@
     }
 
     public void testDispatchKeyEvent() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
                 mListView.requestFocus();
             }
         });
-        mInstrumentation.waitForIdleSync();
         assertTrue(mListView.hasFocus());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setSelection(1);
             }
         });
-        mInstrumentation.waitForIdleSync();
         String item = (String) mListView.getSelectedItem();
         assertEquals(mCountryList[1], item);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
                 mListView.dispatchKeyEvent(keyEvent);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN);
                 mListView.dispatchKeyEvent(keyEvent);
@@ -598,18 +548,16 @@
                 mListView.dispatchKeyEvent(keyEvent);
             }
         });
-        mInstrumentation.waitForIdleSync();
         item = (String)mListView.getSelectedItem();
         assertEquals(mCountryList[4], item);
     }
 
     public void testRequestChildRectangleOnScreen() {
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             public void run() {
                 mListView.setAdapter(mAdapter_countries);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         TextView child = (TextView) mAdapter_countries.getView(0, null, mListView);
         assertNotNull(child);
@@ -828,27 +776,25 @@
         final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity,
                 android.R.layout.simple_list_item_1, items);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, listView, new Runnable() {
             @Override
             public void run() {
                 listView.setAdapter(adapter);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         final View oldItem = listView.getChildAt(2);
         final CharSequence oldText = ((TextView) oldItem.findViewById(android.R.id.text1))
                 .getText();
         oldItem.setHasTransientState(true);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, listView, new Runnable() {
             @Override
             public void run() {
                 adapter.remove(adapter.getItem(0));
                 adapter.notifyDataSetChanged();
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         final View newItem = listView.getChildAt(2);
         final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
@@ -863,13 +809,12 @@
         final StableArrayAdapter<String> adapter = new StableArrayAdapter<String>(mActivity,
                 android.R.layout.simple_list_item_1, items);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mListView, new Runnable() {
             @Override
             public void run() {
                 listView.setAdapter(adapter);
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         final Object tag = new Object();
         final View oldItem = listView.getChildAt(2);
@@ -878,14 +823,13 @@
         oldItem.setHasTransientState(true);
         oldItem.setTag(tag);
 
-        mInstrumentation.runOnMainSync(new Runnable() {
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, listView, new Runnable() {
             @Override
             public void run() {
                 adapter.remove(adapter.getItem(0));
                 adapter.notifyDataSetChanged();
             }
         });
-        mInstrumentation.waitForIdleSync();
 
         final View newItem = listView.getChildAt(1);
         final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
diff --git a/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java b/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java
new file mode 100644
index 0000000..ca6c528
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts.util;
+
+import junit.framework.Assert;
+
+import android.app.Instrumentation;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnDrawListener;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Utilities for testing View behavior.
+ */
+public class ViewTestUtils {
+
+    /**
+     * Runs the specified Runnable on the main thread and ensures that the
+     * specified View's tree is drawn before returning.
+     *
+     * @param instrumentation the instrumentation used to run the test
+     * @param view the view whose tree should be drawn before returning
+     * @param runner the runnable to run on the main thread
+     */
+    public static void runOnMainAndDrawSync(Instrumentation instrumentation,
+            final View view, final Runnable runner) {
+        final Semaphore token = new Semaphore(0);
+        final Runnable releaseToken = new Runnable() {
+            @Override
+            public void run() {
+                token.release();
+            }
+        };
+
+        instrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                final ViewTreeObserver observer = view.getViewTreeObserver();
+                final OnDrawListener listener = new OnDrawListener() {
+                    @Override
+                    public void onDraw() {
+                        observer.removeOnDrawListener(this);
+                        view.post(releaseToken);
+                    }
+                };
+
+                observer.addOnDrawListener(listener);
+                runner.run();
+            }
+        });
+
+        try {
+            Assert.assertTrue("Expected draw pass occurred within 5 seconds",
+                    token.tryAcquire(5, TimeUnit.SECONDS));
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
