diff --git a/jank/jankmicrobenchmark/src/com/android/jankmicrobenchmark/janktests/ApiDemoJankTests.java b/jank/jankmicrobenchmark/src/com/android/jankmicrobenchmark/janktests/ApiDemoJankTests.java
index 07492f3..e123c15 100644
--- a/jank/jankmicrobenchmark/src/com/android/jankmicrobenchmark/janktests/ApiDemoJankTests.java
+++ b/jank/jankmicrobenchmark/src/com/android/jankmicrobenchmark/janktests/ApiDemoJankTests.java
@@ -30,6 +30,7 @@
 import android.support.test.uiautomator.UiObject2;
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.Until;
+import android.widget.Button;
 
 import junit.framework.Assert;
 
@@ -153,4 +154,83 @@
             SystemClock.sleep(LONG_TIMEOUT);
         }
     }
+
+    // Loads the 'loading' animation
+    public void selectLoadingOption() throws UiObjectNotFoundException {
+        launchApiDemosAndSelectAnimation("Loading");
+    }
+    // Measures jank for 'loading' animation
+    @JankTest(beforeTest="selectLoadingOption", afterTest="goBackHome"
+            , expectedFrames=EXPECTED_FRAMES)
+    @GfxMonitor(processName=PACKAGE_NAME)
+    public void testLoadingJank() {
+        UiObject2 runButton = mDevice.wait(Until.findObject(
+            By.res(PACKAGE_NAME, "startButton").text("Run")), LONG_TIMEOUT);
+        Assert.assertNotNull("Run button is null", runButton);
+        for(int i = 0; i < INNER_LOOP; ++i) {
+            runButton.click();
+            SystemClock.sleep(SHORT_TIMEOUT * 2);
+        }
+    }
+
+    // Loads the 'simple transition' animation
+    public void selectSimpleTransitionOption() throws UiObjectNotFoundException {
+        launchApiDemosAndSelectAnimation("Simple Transitions");
+    }
+    // Measures jank for 'simple transition' animation
+    @JankTest(beforeTest="selectSimpleTransitionOption", afterTest="goBackHome"
+            , expectedFrames=EXPECTED_FRAMES)
+    @GfxMonitor(processName=PACKAGE_NAME)
+    public void testSimpleTransitionJank() {
+        for(int i = 0; i < INNER_LOOP; ++i) {
+            UiObject2 scene2 = mDevice.wait(Until.findObject(
+                    By.res(PACKAGE_NAME, "scene2")), LONG_TIMEOUT);
+            Assert.assertNotNull("Scene2 is null", scene2);
+            scene2.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+            UiObject2 scene4 = mDevice.wait(Until.findObject(
+                    By.res(PACKAGE_NAME, "scene4")), LONG_TIMEOUT);
+            Assert.assertNotNull("Scene3 is null", scene4);
+            scene4.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+        }
+    }
+
+    // Loads the 'hide/show' animation
+    public void selectHideShowAnimationOption() throws UiObjectNotFoundException {
+        launchApiDemosAndSelectAnimation("Hide-Show Animations");
+    }
+    // Measures jank for 'hide/show' animation
+    @JankTest(beforeTest="selectHideShowAnimationOption", afterTest="goBackHome"
+            , expectedFrames=EXPECTED_FRAMES)
+    @GfxMonitor(processName=PACKAGE_NAME)
+    public void testHideShowAnimationJank() {
+        for(int i = 0; i < INNER_LOOP; ++i) {
+            UiObject2 showButton = mDevice.wait(Until.findObject(By.res(
+                    PACKAGE_NAME, "addNewButton").text("Show Buttons")), LONG_TIMEOUT);
+            Assert.assertNotNull("SHow Button is null", showButton);
+            showButton.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+            UiObject2 button0 = mDevice.wait(Until.findObject(
+                    By.clazz(Button.class).text("0")), LONG_TIMEOUT);
+            Assert.assertNotNull("Button0 is null", button0);
+            button0.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+            UiObject2 button1 = mDevice.wait(Until.findObject(
+                    By.clazz(Button.class).text("1")), LONG_TIMEOUT);
+            Assert.assertNotNull("Button1 is null", button1);
+            button1.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+            UiObject2 button2 = mDevice.wait(Until.findObject(
+                    By.clazz(Button.class).text("2")), LONG_TIMEOUT);
+            Assert.assertNotNull("Button2 is null", button2);
+            button2.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+            UiObject2 button3 = mDevice.wait(Until.findObject(
+                    By.clazz(Button.class).text("3")), LONG_TIMEOUT);
+            Assert.assertNotNull("Button3 is null", button3);
+            button3.click();
+            SystemClock.sleep(SHORT_TIMEOUT);
+        }
+    }
 }
