diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h
index 195bbc9..3017820 100644
--- a/runtime/mirror/class.h
+++ b/runtime/mirror/class.h
@@ -561,7 +561,7 @@
   // The size of java.lang.Class.class.
   static uint32_t ClassClassSize(size_t pointer_size) {
     // The number of vtable entries in java.lang.Class.
-    uint32_t vtable_entries = Object::kVTableLength + 72;
+    uint32_t vtable_entries = Object::kVTableLength + 69;
     return ComputeClassSize(true, vtable_entries, 0, 0, 4, 1, 0, pointer_size);
   }
 
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc
index a80585a..0ddd4a2 100644
--- a/runtime/native/java_lang_Class.cc
+++ b/runtime/native/java_lang_Class.cc
@@ -469,21 +469,14 @@
   return soa.AddLocalReference<jobjectArray>(ret.Get());
 }
 
-static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass annotationClass) {
+static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass annotationType) {
   ScopedFastNativeObjectAccess soa(env);
   StackHandleScope<2> hs(soa.Self());
   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
-
-  // Handle public contract to throw NPE if the "annotationClass" argument was null.
-  if (UNLIKELY(annotationClass == nullptr)) {
-    ThrowNullPointerException("annotationClass");
-    return nullptr;
-  }
-
   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
     return nullptr;
   }
-  Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class*>(annotationClass)));
+  Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class*>(annotationType)));
   return soa.AddLocalReference<jobject>(
       klass->GetDexFile().GetAnnotationForClass(klass, annotation_class));
 }
diff --git a/test/048-reflect-v8/expected.txt b/test/048-reflect-v8/expected.txt
index 3109ecc..2d0b4cc 100644
--- a/test/048-reflect-v8/expected.txt
+++ b/test/048-reflect-v8/expected.txt
@@ -1,95 +1,4 @@
-==============================
-Are These Methods Default:
-==============================
-IsDefaultTest$DefaultInterface is default = yes
-IsDefaultTest$RegularInterface is default = no
-IsDefaultTest$ImplementsWithDefault is default = yes
-IsDefaultTest$ImplementsWithRegular is default = no
-==============================
-Class annotations by type:
-==============================
-Annotations by type, defined by class SingleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Annotations by type, defined by class SingleUser with annotation Calendars: <empty>
-Annotations by type, defined by class User with annotation Calendar: @Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)
-Annotations by type, defined by class User with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Annotations by type, defined by class User2 with annotation Calendar: @Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)
-Annotations by type, defined by class User2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)])
-Annotations by type, defined by class UserComplex with annotation Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)
-Annotations by type, defined by class UserComplex with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
-Annotations by type, defined by class UserSub with annotation Calendar: @Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)
-Annotations by type, defined by class UserSub with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Annotations by type, defined by class UserSub2 with annotation Calendar: @Calendar(dayOfMonth=sub2, dayOfWeek=unspecified_week, hour=6)
-Annotations by type, defined by class UserSub2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
------------------------------
------------------------------
-==============================
-Class declared annotation:
-==============================
-Declared annotations by class class SingleUser, annotation interface Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Declared annotations by class class SingleUser, annotation interface Calendars: <null>
-Declared annotations by class class User, annotation interface Calendar: <null>
-Declared annotations by class class User, annotation interface Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Declared annotations by class class UserComplex, annotation interface Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6)
-Declared annotations by class class UserComplex, annotation interface Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
-Declared annotations by class class UserSub, annotation interface Calendar: <null>
-Declared annotations by class class UserSub, annotation interface Calendars: <null>
-Declared annotations by class class UserSub2, annotation interface Calendar: @Calendar(dayOfMonth=sub2, dayOfWeek=unspecified_week, hour=6)
-Declared annotations by class class UserSub2, annotation interface Calendars: <null>
------------------------------
------------------------------
-==============================
-Declared class annotations by type:
-==============================
-Declared annnotations by type, defined by class SingleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Declared annnotations by type, defined by class SingleUser with annotation Calendars: <empty>
-Declared annnotations by type, defined by class User with annotation Calendar: @Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)
-Declared annnotations by type, defined by class User with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Declared annnotations by type, defined by class User2 with annotation Calendar: @Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)
-Declared annnotations by type, defined by class User2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)])
-Declared annnotations by type, defined by class UserComplex with annotation Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)
-Declared annnotations by type, defined by class UserComplex with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
-Declared annnotations by type, defined by class UserSub with annotation Calendar: <empty>
-Declared annnotations by type, defined by class UserSub with annotation Calendars: <empty>
-Declared annnotations by type, defined by class UserSub2 with annotation Calendar: @Calendar(dayOfMonth=sub2, dayOfWeek=unspecified_week, hour=6)
-Declared annnotations by type, defined by class UserSub2 with annotation Calendars: <empty>
------------------------------
------------------------------
-==============================
-Method annotations by type:
-==============================
-Annotations by type, defined by method singleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Annotations by type, defined by method singleUser with annotation Calendars: <empty>
-Annotations by type, defined by method user with annotation Calendar: @Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)
-Annotations by type, defined by method user with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Annotations by type, defined by method user2 with annotation Calendar: @Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)
-Annotations by type, defined by method user2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)])
-Annotations by type, defined by method userComplex with annotation Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)
-Annotations by type, defined by method userComplex with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
------------------------------
------------------------------
-==============================
-Declared method annotations:
-==============================
-Annotations declared by method singleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Annotations declared by method singleUser with annotation Calendars: <null>
-Annotations declared by method user with annotation Calendar: <null>
-Annotations declared by method user with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Annotations declared by method user2 with annotation Calendar: <null>
-Annotations declared by method user2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)])
-Annotations declared by method userComplex with annotation Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6)
-Annotations declared by method userComplex with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
------------------------------
------------------------------
-==============================
-Declared method annotations by type:
-==============================
-Annotations by type, defined by method singleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23)
-Annotations by type, defined by method singleUser with annotation Calendars: <empty>
-Annotations by type, defined by method user with annotation Calendar: @Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)
-Annotations by type, defined by method user with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=last, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=unspecified_month, dayOfWeek=Fri, hour=23)])
-Annotations by type, defined by method user2 with annotation Calendar: @Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)
-Annotations by type, defined by method user2 with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=z, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=x, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=y, dayOfWeek=unspecified_week, hour=6)])
-Annotations by type, defined by method userComplex with annotation Calendar: @Calendar(dayOfMonth=afirst, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)
-Annotations by type, defined by method userComplex with annotation Calendars: @Calendars(value=[@Calendar(dayOfMonth=zsecond, dayOfWeek=unspecified_week, hour=6), @Calendar(dayOfMonth=athird, dayOfWeek=unspecified_week, hour=23)])
------------------------------
------------------------------
+Main$DefaultInterface is default = yes
+Main$RegularInterface is default = no
+Main$ImplementsWithDefault is default = yes
+Main$ImplementsWithRegular is default = no
diff --git a/test/048-reflect-v8/src/AnnotationTest.java b/test/048-reflect-v8/src/AnnotationTest.java
deleted file mode 100644
index 75e6845..0000000
--- a/test/048-reflect-v8/src/AnnotationTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * 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.
- */
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-
-public class AnnotationTest extends AnnotationTestHelpers {
-  public static void testAnnotationsByType() {
-    System.out.println("==============================");
-    System.out.println("Class annotations by type:");
-    System.out.println("==============================");
-
-    // Print associated annotations:
-    // * A is directly present or repeatably present on an element E;
-    // * No annotation of A is directly/repeatably present on an element
-    //   AND E is a class AND A's type is inheritable, AND A is associated with its superclass.
-    // (Looks through subtypes recursively only if there's 0 result at each level,
-    // and the annotation is @Inheritable).
-    printAnnotationsByType(Calendar.class, SingleUser.class);
-    printAnnotationsByType(Calendars.class, SingleUser.class);
-
-    printAnnotationsByType(Calendar.class, User.class);
-    printAnnotationsByType(Calendars.class, User.class);
-
-    printAnnotationsByType(Calendar.class, User2.class);  // Enforce ordering 'z,x,y'
-    printAnnotationsByType(Calendars.class, User2.class);
-
-    // NOTE:
-    //    Order of outer-most annotations Calendars[C,C],S vs C,Calendars[C,C] is unspecified.
-    //    In particular it's the order of #getDeclaredAnnotations which is completely unmentioned.
-    //    The only requirement for #getAnnotationsByType is to have same ordering as
-    //    #getDeclaredAnnotations.
-    //    (Calendars[] itself has to maintain value() order).
-    printAnnotationsByType(Calendar.class, UserComplex.class);  // Cs(C,C),C collapses into C,C,C.
-    printAnnotationsByType(Calendars.class, UserComplex.class);
-
-    printAnnotationsByType(Calendar.class, UserSub.class);
-    printAnnotationsByType(Calendars.class, UserSub.class);
-
-    printAnnotationsByType(Calendar.class, UserSub2.class);
-    // The directly present "Calendar" annotation masks all the repeatably present
-    // "Calendar" annotations coming from User.
-    printAnnotationsByType(Calendars.class, UserSub2.class);
-    // Edge case: UserSub2 doesn't directly have a Calendars annotation,
-    // so it doesn't mask the "User" Calendars annotation.
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-
-  }
-
-  public static void testDeclaredAnnotation() {
-    System.out.println("==============================");
-    System.out.println("Class declared annotation:");
-    System.out.println("==============================");
-
-    // Print directly present annotations:
-    //
-    // The element E has an annotation_item for it (accessible through an
-    // annotations_directory_item) corresponding to an annotation A,
-    // and A's type_idx must match that on the encoded_annotation (from the annotation_item).
-    // (Does not look through the subtypes recursively)
-    printDeclaredAnnotation(SingleUser.class, Calendar.class);
-    printDeclaredAnnotation(SingleUser.class, Calendars.class);
-
-    printDeclaredAnnotation(User.class, Calendar.class);
-    printDeclaredAnnotation(User.class, Calendars.class);
-
-    printDeclaredAnnotation(UserComplex.class, Calendar.class);
-    printDeclaredAnnotation(UserComplex.class, Calendars.class);
-
-    printDeclaredAnnotation(UserSub.class, Calendar.class);
-    printDeclaredAnnotation(UserSub.class, Calendars.class);
-
-    printDeclaredAnnotation(UserSub2.class, Calendar.class);
-    printDeclaredAnnotation(UserSub2.class, Calendars.class);
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-  }
-
-  public static void testDeclaredAnnotationsByType() {
-    System.out.println("==============================");
-    System.out.println("Declared class annotations by type:");
-    System.out.println("==============================");
-
-    // A is directly present or repeatably present on an element E;
-    // -- (does not do any recursion for classes regardless of @Inherited)
-    printDeclaredAnnotationsByType(Calendar.class, SingleUser.class);
-    printDeclaredAnnotationsByType(Calendars.class, SingleUser.class);
-
-    printDeclaredAnnotationsByType(Calendar.class, User.class);
-    printDeclaredAnnotationsByType(Calendars.class, User.class);
-
-    printDeclaredAnnotationsByType(Calendar.class, User2.class);  // Enforce ordering 'z,x,y'
-    printDeclaredAnnotationsByType(Calendars.class, User2.class);
-
-    printDeclaredAnnotationsByType(Calendar.class, UserComplex.class);
-    printDeclaredAnnotationsByType(Calendars.class, UserComplex.class);
-
-    printDeclaredAnnotationsByType(Calendar.class, UserSub.class);
-    printDeclaredAnnotationsByType(Calendars.class, UserSub.class);
-
-    printDeclaredAnnotationsByType(Calendar.class, UserSub2.class);
-    // The directly present "Calendar" annotation masks all the repeatably present "Calendar"
-    // annotations coming from User.
-    printDeclaredAnnotationsByType(Calendars.class, UserSub2.class);
-    // Edge case: UserSub2 doesn't directly have a Calendars annotation,
-    // so it doesn't mask the "User" Calendars annotation.
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-  }
-
-  // Print the annotation "annotationClass" that is associated with an element denoted by
-  // "annotationUseClass."
-  private static <A extends Annotation> void printAnnotationsByType(Class<A> annotationClass,
-      Class<?> annotationUseClass) {
-    A[] annotationsByType = annotationUseClass.getAnnotationsByType(annotationClass);
-
-    String msg = "Annotations by type, defined by class "
-        + annotationUseClass.getName() + " with annotation " + annotationClass.getName() + ": "
-        + asString(annotationsByType);
-
-
-    System.out.println(msg);
-  }
-
-  private static <A extends Annotation> void printDeclaredAnnotation(Class<?> annotationUseClass,
-      Class<A> annotationDefClass) {
-    A anno = annotationUseClass.getDeclaredAnnotation(annotationDefClass);
-
-    String msg = asString(anno);
-
-    System.out.println("Declared annotations by class " + annotationUseClass
-        + ", annotation " + annotationDefClass + ": " + msg);
-  }
-
-  // Print the annotation "annotationClass" that is directly/indirectly present with an element
-  // denoted by "annotationUseClass."
-  private static <A extends Annotation> void printDeclaredAnnotationsByType(
-      Class<A> annotationClass, Class<?> annotationUseClass) {
-    A[] annotationsByType = annotationUseClass.getDeclaredAnnotationsByType(annotationClass);
-
-    String msg = "Declared annnotations by type, defined by class " + annotationUseClass.getName()
-        + " with annotation " + annotationClass.getName() + ": "
-        + asString(annotationsByType);
-
-    System.out.println(msg);
-  }
-
-  public static void testMethodAnnotationsByType() {
-    System.out.println("==============================");
-    System.out.println("Method annotations by type:");
-    System.out.println("==============================");
-
-    // Print associated annotations:
-    // * A is directly present or repeatably present on an element E;
-    // * No annotation of A is directly/repeatably present on an element AND E is a class
-    //   AND A's type is inheritable, AND A is associated with its superclass.
-    // (Looks through subtypes recursively only if there's 0 result at each level,
-    // and the annotation is @Inheritable).
-    printMethodAnnotationsByType(Calendar.class, "singleUser", AnnotationTestFixture.class);
-    printMethodAnnotationsByType(Calendars.class, "singleUser", AnnotationTestFixture.class);
-
-    printMethodAnnotationsByType(Calendar.class, "user", AnnotationTestFixture.class);
-    printMethodAnnotationsByType(Calendars.class, "user", AnnotationTestFixture.class);
-
-    printMethodAnnotationsByType(Calendar.class, "user2", AnnotationTestFixture.class);
-    printMethodAnnotationsByType(Calendars.class, "user2", AnnotationTestFixture.class);
-
-    printMethodAnnotationsByType(Calendar.class, "userComplex", AnnotationTestFixture.class);
-    printMethodAnnotationsByType(Calendars.class, "userComplex", AnnotationTestFixture.class);
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-  }
-
-  // Print the annotation "annotationClass" that is associated with an element denoted by
-  // "annotationUseClass" method methodName.
-  private static <A extends Annotation> void printMethodAnnotationsByType(Class<A> annotationClass,
-      String methodName, Class<?> annotationUseClass) {
-    Method m = null;
-    try {
-      m = annotationUseClass.getDeclaredMethod(methodName);
-    } catch (Throwable t) {
-      throw new AssertionError(t);
-    }
-    A[] annotationsByType = m.getAnnotationsByType(annotationClass);
-
-    String msg = "Annotations by type, defined by method " + m.getName() + " with annotation " +
-      annotationClass.getName() + ": " +
-      asString(annotationsByType);
-
-    System.out.println(msg);
-  }
-
-  public static void testMethodDeclaredAnnotations() {
-    System.out.println("==============================");
-    System.out.println("Declared method annotations:");
-    System.out.println("==============================");
-
-    printMethodDeclaredAnnotation(Calendar.class, "singleUser", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotation(Calendars.class, "singleUser", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotation(Calendar.class, "user", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotation(Calendars.class, "user", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotation(Calendar.class, "user2", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotation(Calendars.class, "user2", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotation(Calendar.class, "userComplex", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotation(Calendars.class, "userComplex", AnnotationTestFixture.class);
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-  }
-
-  // Print the annotation "annotationClass" that is associated with an element denoted by
-  // methodName in annotationUseClass.
-  private static <A extends Annotation> void printMethodDeclaredAnnotation(Class<A> annotationClass,
-      String methodName, Class<?> annotationUseClass) {
-    Method m = null;
-    try {
-      m = annotationUseClass.getDeclaredMethod(methodName);
-    } catch (Throwable t) {
-      throw new AssertionError(t);
-    }
-    Annotation annotationsByType = m.getDeclaredAnnotation(annotationClass);
-
-    String msg = "Annotations declared by method " + m.getName() + " with annotation "
-        + annotationClass.getName() + ": "
-        + asString(annotationsByType);
-
-    System.out.println(msg);
-  }
-
-  public static void testMethodDeclaredAnnotationsByType() {
-    System.out.println("==============================");
-    System.out.println("Declared method annotations by type:");
-    System.out.println("==============================");
-
-    printMethodDeclaredAnnotationByType(Calendar.class, "singleUser", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotationByType(Calendars.class, "singleUser", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotationByType(Calendar.class, "user", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotationByType(Calendars.class, "user", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotationByType(Calendar.class, "user2", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotationByType(Calendars.class, "user2", AnnotationTestFixture.class);
-
-    printMethodDeclaredAnnotationByType(Calendar.class, "userComplex", AnnotationTestFixture.class);
-    printMethodDeclaredAnnotationByType(Calendars.class, "userComplex",
-        AnnotationTestFixture.class);
-
-    System.out.println("-----------------------------");
-    System.out.println("-----------------------------");
-  }
-
-  // Print the annotation "annotationClass" that is associated with an element denoted by
-  // methodName in annotationUseClass.
-  private static <A extends Annotation> void printMethodDeclaredAnnotationByType(
-      Class<A> annotationClass, String methodName, Class<?> annotationUseClass) {
-    Method m = null;
-    try {
-      m = annotationUseClass.getDeclaredMethod(methodName);
-    } catch (Throwable t) {
-      throw new AssertionError(t);
-    }
-    A[] annotationsByType = m.getDeclaredAnnotationsByType(annotationClass);
-
-    String msg = "Annotations by type, defined by method " + m.getName() + " with annotation "
-        + annotationClass.getName() + ": "
-        + asString(annotationsByType);
-
-    System.out.println(msg);
-  }
-}
diff --git a/test/048-reflect-v8/src/AnnotationTestFixture.java b/test/048-reflect-v8/src/AnnotationTestFixture.java
deleted file mode 100644
index 248dfac..0000000
--- a/test/048-reflect-v8/src/AnnotationTestFixture.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
- */
-
-public class AnnotationTestFixture {
-
-  @Calendar(dayOfWeek="single", hour=23)
-  public static void singleUser() {
-
-  }
-  @Calendars ({
-    @Calendar(dayOfMonth="last"),
-    @Calendar(dayOfWeek="Fri", hour=23)
-  })
-  public static void user() {
-
-  }
-
-  @Calendars ({
-    @Calendar(dayOfMonth="z"),
-    @Calendar(dayOfMonth="x"),
-    @Calendar(dayOfMonth="y")
-  })
-  public static void user2() {
-
-  }
-
-  @Calendar(dayOfMonth="afirst")
-  @Calendars ({
-    @Calendar(dayOfMonth="zsecond"),
-    @Calendar(dayOfMonth="athird", hour=23)
-  })
-  public static void userComplex() {
-
-  }
-}
diff --git a/test/048-reflect-v8/src/AnnotationTestHelpers.java b/test/048-reflect-v8/src/AnnotationTestHelpers.java
deleted file mode 100644
index 6b5bea2..0000000
--- a/test/048-reflect-v8/src/AnnotationTestHelpers.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.
- */
-
-import java.lang.annotation.Annotation;
-
-public class AnnotationTestHelpers {
-  // Provide custom print function that print a deterministic output.
-  // Note that Annotation#toString has unspecified order: it prints out the
-  // fields, which is why we can't rely on it.
-
-  public static String asString(Annotation anno) {
-    if (anno instanceof Calendar) {
-      return asString((Calendar)anno);
-    } else if (anno instanceof Calendars) {
-      return asString((Calendars)anno);
-    } else {
-      if (anno == null) {
-        return "<null>";
-      }
-      // Fall-back, usually would only go here in a test failure.
-      return anno.toString();
-    }
-  }
-
-  public static String asString(Annotation[] annos) {
-    String msg = "";
-
-    if (annos == null) {
-      msg += "<null>";
-    } else if (annos.length == 0) {
-      msg += "<empty>";
-    } else {
-      for (int i = 0; i < annos.length; ++i) {
-        msg += asString(annos[i]);
-
-        if (i != annos.length - 1) {
-          msg += ", ";
-        }
-      }
-    }
-
-    return msg;
-  }
-
-  public static String asString(Calendar calendar) {
-    if (calendar == null) {
-      return "<null>";
-    }
-
-    return "@Calendar(dayOfMonth=" + calendar.dayOfMonth() + ", dayOfWeek=" +
-      calendar.dayOfWeek() + ", hour=" + calendar.hour() + ")";
-  }
-
-  public static String asString(Calendars calendars) {
-    if (calendars == null) {
-      return "<null>";
-    }
-
-    String s = "@Calendars(value=[";
-
-    Calendar[] allValues = calendars.value();
-    for (int i = 0; i < allValues.length; ++i) {
-      s += asString(allValues[i]);
-      if (i != allValues.length - 1) {
-        s += ", ";
-      }
-    }
-
-    s += "])";
-
-    return s;
-  }
-}
diff --git a/test/048-reflect-v8/src/Calendar.java b/test/048-reflect-v8/src/Calendar.java
deleted file mode 100644
index 4a16573..0000000
--- a/test/048-reflect-v8/src/Calendar.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Repeatable;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-// This is a plain old non-1.8 annotation. At runtime we can see that it has a
-// "Repeatable" annotation if we query with getDeclaredAnnotation(Repeatable.class)
-@Retention(RetentionPolicy.RUNTIME)
-@Repeatable(Calendars.class)
-@Inherited  // note: container must also be @Inherited by JLS.
-public @interface Calendar {
-    String dayOfMonth() default "unspecified_month";
-    String dayOfWeek() default "unspecified_week";
-    int hour() default 6;
-}
-
diff --git a/test/048-reflect-v8/src/Calendars.java b/test/048-reflect-v8/src/Calendars.java
deleted file mode 100644
index caeda52..0000000
--- a/test/048-reflect-v8/src/Calendars.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-// Plain old annotation, there's nothing 1.8 specific about it.
-@Retention(RetentionPolicy.RUNTIME)
-@Inherited  // note: elements must also be @Inherited by JLS.
-public @interface Calendars {
-  Calendar[] value();
-}
diff --git a/test/048-reflect-v8/src/IFaceA.java b/test/048-reflect-v8/src/IFaceA.java
deleted file mode 100644
index 9b1f610..0000000
--- a/test/048-reflect-v8/src/IFaceA.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-
-// Stored as a complex annotation Calendars(Calendar,Calendar)
-// in the binary.
-@Calendars ({
-  @Calendar(dayOfMonth="if_a_first"),
-  @Calendar(dayOfMonth="if_b_last")
-})
-public interface IFaceA {
-}
diff --git a/test/048-reflect-v8/src/IFaceSimple.java b/test/048-reflect-v8/src/IFaceSimple.java
deleted file mode 100644
index 93cf610..0000000
--- a/test/048-reflect-v8/src/IFaceSimple.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-// Simple annotation, no container.
-@Calendar(dayOfMonth="if_simple_first")
-public interface IFaceSimple {
-
-}
diff --git a/test/048-reflect-v8/src/IsDefaultTest.java b/test/048-reflect-v8/src/IsDefaultTest.java
deleted file mode 100644
index 177dcf1..0000000
--- a/test/048-reflect-v8/src/IsDefaultTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-
-import java.lang.reflect.Method;
-
-public class IsDefaultTest {
-  interface DefaultInterface {
-    default void sayHi() {
-      System.out.println("hi default");
-    }
-  }
-
-  interface RegularInterface {
-    void sayHi();
-  }
-
-  class ImplementsWithDefault implements DefaultInterface {}
-  class ImplementsWithRegular implements RegularInterface {
-    public void sayHi() {
-      System.out.println("hello specific");
-    }
-  }
-
-  private static void printIsDefault(Class<?> klass) {
-    Method m;
-    try {
-      m = klass.getMethod("sayHi");
-    } catch (Throwable t) {
-      System.out.println(t);
-      return;
-    }
-
-    boolean isDefault = m.isDefault();
-    System.out.println(klass.getName() + " is default = " + (isDefault ? "yes" : "no"));
-  }
-
-  public static void test() {
-    System.out.println("==============================");
-    System.out.println("Are These Methods Default:");
-    System.out.println("==============================");
-
-    printIsDefault(DefaultInterface.class);
-    printIsDefault(RegularInterface.class);
-    printIsDefault(ImplementsWithDefault.class);
-    printIsDefault(ImplementsWithRegular.class);
-  }
-}
diff --git a/test/048-reflect-v8/src/Main.java b/test/048-reflect-v8/src/Main.java
index f2b8287..7fa2a92 100644
--- a/test/048-reflect-v8/src/Main.java
+++ b/test/048-reflect-v8/src/Main.java
@@ -14,14 +14,43 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Method;
+
 public class Main {
+  interface DefaultInterface {
+    default void sayHi() {
+      System.out.println("hi default");
+    }
+  }
+
+  interface RegularInterface {
+    void sayHi();
+  }
+
+  class ImplementsWithDefault implements DefaultInterface {}
+  class ImplementsWithRegular implements RegularInterface {
+    public void sayHi() {
+      System.out.println("hello specific");
+    }
+  }
+
+  private static void printIsDefault(Class<?> klass) {
+    Method m;
+    try {
+      m = klass.getMethod("sayHi");
+    } catch (Throwable t) {
+      System.out.println(t);
+      return;
+    }
+
+    boolean isDefault = m.isDefault();
+    System.out.println(klass.getName() + " is default = " + (isDefault ? "yes" : "no"));
+  }
+
   public static void main(String[] args) {
-    IsDefaultTest.test();
-    AnnotationTest.testAnnotationsByType();
-    AnnotationTest.testDeclaredAnnotation();
-    AnnotationTest.testDeclaredAnnotationsByType();
-    AnnotationTest.testMethodAnnotationsByType();
-    AnnotationTest.testMethodDeclaredAnnotations();
-    AnnotationTest.testMethodDeclaredAnnotationsByType();
+    printIsDefault(DefaultInterface.class);
+    printIsDefault(RegularInterface.class);
+    printIsDefault(ImplementsWithDefault.class);
+    printIsDefault(ImplementsWithRegular.class);
   }
 }
diff --git a/test/048-reflect-v8/src/SingleUser.java b/test/048-reflect-v8/src/SingleUser.java
deleted file mode 100644
index 0f9c430..0000000
--- a/test/048-reflect-v8/src/SingleUser.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-// Stored as a single "Calendar" annotation in the binary.
-@Calendar(dayOfWeek="single", hour=23)
-public class SingleUser {
-
-}
diff --git a/test/048-reflect-v8/src/User.java b/test/048-reflect-v8/src/User.java
deleted file mode 100644
index 003ceeb..0000000
--- a/test/048-reflect-v8/src/User.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.
- */
-
-// Stored as a complex annotation Calendars(Calendar,Calendar)
-// in the binary.
-//
-/* FIXME: Use this code instead, when Jack supports repeatable annotations properly.
- *
- * @Calendar(dayOfMonth="last")
- * @Calendar(dayOfWeek="Fri", hour=23)
- */
-@Calendars ({
-  @Calendar(dayOfMonth="last"),
-  @Calendar(dayOfWeek="Fri", hour=23)
-})
-public class User {
-
-}
diff --git a/test/048-reflect-v8/src/User2.java b/test/048-reflect-v8/src/User2.java
deleted file mode 100644
index 1a6049f..0000000
--- a/test/048-reflect-v8/src/User2.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.
- */
-
-// Stored as a complex annotation Calendars(Calendar,Calendar,Calendar)
-// in the binary.
-// (Check for order, should be z,x,y)
-@Calendars ({
-  @Calendar(dayOfMonth="z"),
-  @Calendar(dayOfMonth="x"),
-  @Calendar(dayOfMonth="y")
-})
-public class User2 {
-
-}
diff --git a/test/048-reflect-v8/src/UserComplex.java b/test/048-reflect-v8/src/UserComplex.java
deleted file mode 100644
index e262349..0000000
--- a/test/048-reflect-v8/src/UserComplex.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.
- */
-
-// Stored as a complex annotation Calendars(Calendar,Calendar)
-// followed by a Calendar in the binary.
-// In other words { Calendars([C,C]), C }
-//
-// Note that trying to do {C,Calendars,C} or similar
-// is illegal by the JLS.
-@Calendar(dayOfMonth="afirst")
-@Calendars ({
-  @Calendar(dayOfMonth="zsecond"),
-  @Calendar(dayOfMonth="athird", hour=23)
-})
-// @Calendar(dayOfMonth="zlast")  // Leave for future ordering test
-public class UserComplex {
-
-}
diff --git a/test/048-reflect-v8/src/UserSub.java b/test/048-reflect-v8/src/UserSub.java
deleted file mode 100644
index d60aa6a..0000000
--- a/test/048-reflect-v8/src/UserSub.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-public class UserSub
-  extends User
-  implements IFaceA, IFaceSimple {
-
-}
diff --git a/test/048-reflect-v8/src/UserSub2.java b/test/048-reflect-v8/src/UserSub2.java
deleted file mode 100644
index 13e2eb0..0000000
--- a/test/048-reflect-v8/src/UserSub2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.
- */
-
-// This calendar subsumes anything else we would've normally gotten from the subclass.
-@Calendar(dayOfMonth="sub2")
-public class UserSub2
-  extends User
-  implements IFaceA, IFaceSimple {
-
-}
