diff --git a/src/test/examplesAndroidO/invokecustom/InvokeCustom.java b/src/test/examplesAndroidO/invokecustom/InvokeCustom.java
new file mode 100644
index 0000000..0d4d5c5
--- /dev/null
+++ b/src/test/examplesAndroidO/invokecustom/InvokeCustom.java
@@ -0,0 +1,177 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package invokecustom;
+
+import java.lang.invoke.CallSite;
+import java.lang.invoke.ConstantCallSite;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+
+interface J {
+
+  default void targetMethodTest8() {
+    System.out.println("targetMethodTest8 from J");
+  }
+
+  default void targetMethodTest7() {
+    System.out.println("targetMethodTest7 from J");
+  }
+
+  default void targetMethodTest6() {
+    System.out.println("targetMethodTest6 from J");
+  }
+}
+
+interface I extends J {
+  void targetMethodTest8();
+
+  default void targetMethodTest6() {
+    System.out.println("targetMethodTest6 from I");
+  }
+
+  default void targetMethodTest9() {
+    System.out.println("targetMethodTest9 from I");
+  }
+
+  default void targetMethodTest10() {
+    System.out.println("targetMethodTest10 from I");
+  }
+}
+
+abstract class Super {
+  public void targetMethodTest5() {
+    System.out.println("targetMethodTest5 from Super");
+  }
+
+  abstract void targetMethodTest10();
+}
+
+public class InvokeCustom extends Super implements I {
+
+  private static String staticField1 = "StaticField1";
+
+  private String instanceField1 = "instanceField1";
+
+  private static void targetMethodTest1() {
+    System.out.println("Hello World!");
+  }
+
+  private static void targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l,
+      double d, String str) {
+    System.out.println(z);
+    System.out.println(b);
+    System.out.println(c);
+    System.out.println(s);
+    System.out.println(i);
+    System.out.println(f);
+    System.out.println(l);
+    System.out.println(d);
+    System.out.println(str);
+  }
+
+  private static void targetMethodTest3() {
+  }
+
+  public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)
+      throws NoSuchMethodException, IllegalAccessException {
+    final MethodHandles.Lookup lookup = MethodHandles.lookup();
+    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+    return new ConstantCallSite(targetMH.asType(type));
+  }
+
+  public static CallSite bsmLookupStaticWithExtraArgs(
+      MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
+      throws NoSuchMethodException, IllegalAccessException {
+    System.out.println(i);
+    System.out.println(l);
+    System.out.println(f);
+    System.out.println(d);
+    final MethodHandles.Lookup lookup = MethodHandles.lookup();
+    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+    return new ConstantCallSite(targetMH.asType(type));
+  }
+
+  @Override
+  public void targetMethodTest5() {
+    System.out.println("targetMethodTest5 from InvokeCustom");
+  }
+
+  private static void targetMethodTest4() {
+    System.out.println("targetMethodTest4");
+  }
+
+  public static CallSite bsmCreateCallSite(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH = MethodHandles.lookup().findSpecial(Super.class,
+                "targetMethodTest5", MethodType.methodType(void.class), InvokeCustom.class);
+    return new ConstantCallSite(targetMH);
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethodTest6(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH =
+        MethodHandles.lookup().findVirtual(
+            I.class, "targetMethodTest6", MethodType.methodType(void.class));
+    return new ConstantCallSite(targetMH);
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethodTest7(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH =
+        MethodHandles.lookup().findVirtual(
+            J.class, "targetMethodTest7", MethodType.methodType(void.class));
+    return new ConstantCallSite(targetMH);
+  }
+
+  public void targetMethodTest8() {
+    System.out.println("targetMethodTest8 from InvokeCustom");
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethodTest8(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH =
+        MethodHandles.lookup().findVirtual(
+            J.class, "targetMethodTest8", MethodType.methodType(void.class));
+    return new ConstantCallSite(targetMH);
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethodTest9(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH =
+        MethodHandles.lookup().findVirtual(
+            InvokeCustom.class, "targetMethodTest9", MethodType.methodType(void.class));
+    return new ConstantCallSite(targetMH);
+  }
+
+  public void targetMethodTest10() {
+    System.out.println("targetMethodTest10 from InvokeCustom");
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethodTest10(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    // Using mh to create the call site fails when run on Art. See b/36957105 for details.
+    final MethodHandle targetMH =
+        MethodHandles.lookup().findVirtual(
+            InvokeCustom.class, "targetMethodTest10", MethodType.methodType(void.class));
+    return new ConstantCallSite(targetMH);
+  }
+
+  public static CallSite bsmCreateCallCallingtargetMethod(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    return new ConstantCallSite(mh);
+  }
+}
