Use Human specification as input for JDK11

Bug: 184026720
Change-Id: I021e773e1e5fef6340e1f44d7ff7e8ab24bac9b9
diff --git a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
index f3a4daa..f240706 100644
--- a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
@@ -1,33 +1,28 @@
 {
-  "configuration_format_version": 3,
-  "group_id" : "com.tools.android",
-  "artifact_id" : "chm_only_desugar_jdk_libs",
-  "version": "1.0.12",
+  "identifier": "com.tools.android:chm_only_desugar_jdk_libs:1.0.12",
+  "configuration_format_version": 100,
   "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
+    {
+      "api_level_below_or_equal": 23,
+      "rewrite_prefix": {
+        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
+        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom"
+      }
+    }
   ],
+  "program_flags": [],
   "library_flags": [
     {
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
         "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers",
-        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
         "sun.misc.Desugar": "j$.sun.misc.Desugar"
       }
     }
   ],
-  "program_flags": [
-    {
-      "api_level_below_or_equal": 23,
-      "rewrite_prefix": {
-        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap"
-      }
-    }
-  ],
   "shrinker_config": [
     "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$TreeBin { int lockState; }",
     "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { int sizeCtl; int transferIndex; long baseCount; int cellsBusy; }",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index b075745..778274a 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -1,216 +1,11 @@
 {
-  "configuration_format_version": 3,
-  "group_id" : "com.tools.android",
-  "artifact_id" : "desugar_jdk_libs",
-  "version": "2.0.0",
+  "identifier": "com.tools.android:desugar_jdk_libs:2.0.0",
+  "configuration_format_version": 100,
   "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": true,
   "common_flags": [
     {
-      "api_level_below_or_equal": 25,
-      "wrapper_conversion": [
-        "java.time.Clock"
-      ]
-    },
-    {
-      "api_level_below_or_equal": 23,
-      "wrapper_conversion": [
-        "java.util.PrimitiveIterator$OfDouble",
-        "java.util.PrimitiveIterator$OfInt",
-        "java.util.PrimitiveIterator$OfLong",
-        "java.util.Spliterator",
-        "java.util.Spliterator$OfDouble",
-        "java.util.Spliterator$OfInt",
-        "java.util.Spliterator$OfLong",
-        "java.util.Spliterator$OfPrimitive",
-        "java.util.function.BiConsumer",
-        "java.util.function.BiFunction",
-        "java.util.function.BiPredicate",
-        "java.util.function.BinaryOperator",
-        "java.util.function.Consumer",
-        "java.util.function.DoubleBinaryOperator",
-        "java.util.function.DoubleConsumer",
-        "java.util.function.DoubleFunction",
-        "java.util.function.DoublePredicate",
-        "java.util.function.DoubleToIntFunction",
-        "java.util.function.DoubleToLongFunction",
-        "java.util.function.DoubleUnaryOperator",
-        "java.util.function.Function",
-        "java.util.function.IntBinaryOperator",
-        "java.util.function.IntConsumer",
-        "java.util.function.IntFunction",
-        "java.util.function.IntPredicate",
-        "java.util.function.IntToDoubleFunction",
-        "java.util.function.IntToLongFunction",
-        "java.util.function.IntUnaryOperator",
-        "java.util.function.LongBinaryOperator",
-        "java.util.function.LongConsumer",
-        "java.util.function.LongFunction",
-        "java.util.function.LongPredicate",
-        "java.util.function.LongToDoubleFunction",
-        "java.util.function.LongToIntFunction",
-        "java.util.function.LongUnaryOperator",
-        "java.util.function.ObjDoubleConsumer",
-        "java.util.function.ObjIntConsumer",
-        "java.util.function.ObjLongConsumer",
-        "java.util.function.Predicate",
-        "java.util.function.Supplier",
-        "java.util.function.ToDoubleFunction",
-        "java.util.function.ToIntFunction",
-        "java.util.function.ToLongFunction",
-        "java.util.function.UnaryOperator",
-        "java.util.stream.BaseStream",
-        "java.util.stream.Collector",
-        "java.util.stream.DoubleStream",
-        "java.util.stream.IntStream",
-        "java.util.stream.LongStream",
-        "java.util.stream.Stream"
-      ]
-    }
-  ],
-  "library_flags": [
-    {
-      "api_level_below_or_equal": 10000,
-      "rewrite_prefix": {
-        "desugar.": "j$.desugar.",
-        "libcore.": "j$.libcore.",
-        "java.net.URLDecoder": "j$.net.URLDecoder",
-        "java.net.URLEncoder": "j$.net.URLEncoder",
-        "java.lang.Desugar": "j$.lang.Desugar",
-        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
-        "sun.security.action.": "j$.sun.security.action."
-      }
-    },
-    {
-      "api_level_below_or_equal": 30,
-      "rewrite_prefix": {
-        "j$.time.": "java.time.",
-        "java.time.": "j$.time.",
-        "java.util.Desugar": "j$.util.Desugar"
-      },
-      "retarget_lib_member": {
-        "java.util.Date#toInstant": "java.util.DesugarDate",
-        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
-        "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
-      },
-      "custom_conversion": {
-        "java.time.ZonedDateTime": "java.time.TimeConversions",
-        "java.time.LocalDate": "java.time.TimeConversions",
-        "java.time.Duration": "java.time.TimeConversions",
-        "java.time.ZoneId": "java.time.TimeConversions",
-        "java.time.MonthDay": "java.time.TimeConversions",
-        "java.time.Instant": "java.time.TimeConversions"
-      }
-    },
-    {
-      "api_level_below_or_equal": 29,
-      "rewrite_prefix": {
-        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
-      }
-    },
-    {
-      "api_level_below_or_equal": 25,
-      "rewrite_prefix": {
-        "java.io.DesugarFile" : "j$.io.DesugarFile",
-        "sun.misc.Desugar": "j$.sun.misc.Desugar",
-        "jdk.internal.": "j$.jdk.internal.",
-        "java.nio.Desugar": "j$.nio.Desugar",
-        "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
-        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
-        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
-        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
-        "java.nio.file.": "j$.nio.file.",
-        "sun.nio.cs." : "j$.sun.nio.cs.",
-        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
-        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
-        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
-        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
-        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
-      },
-      "backport": {
-        "java.lang.DesugarDouble": "java.lang.Double",
-        "java.lang.DesugarInteger": "java.lang.Integer",
-        "java.lang.DesugarLong": "java.lang.Long",
-        "java.lang.DesugarMath": "java.lang.Math"
-      },
-      "retarget_lib_member": {
-        "java.io.File#toPath": "java.io.DesugarFile"
-      }
-    },
-    {
-      "api_level_below_or_equal": 23,
-      "rewrite_prefix": {
-        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
-        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
-        "j$.util.Optional": "java.util.Optional",
-        "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
-        "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
-        "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
-        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
-        "java.util.stream.": "j$.util.stream.",
-        "java.util.function.": "j$.util.function.",
-        "java.util.Comparators": "j$.util.Comparators",
-        "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
-        "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
-        "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
-        "java.util.Optional": "j$.util.Optional",
-        "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
-        "java.util.SortedSet$1": "j$.util.SortedSet$1",
-        "java.util.Spliterator": "j$.util.Spliterator",
-        "java.util.StringJoiner": "j$.util.StringJoiner",
-        "java.util.Tripwire": "j$.util.Tripwire",
-        "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers",
-        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
-        "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
-        "java.util.AbstractList": "j$.util.AbstractList",
-        "java.util.CollSer": "j$.util.CollSer",
-        "java.util.ImmutableCollections": "j$.util.ImmutableCollections",
-        "java.util.KeyValueHolder": "j$.util.KeyValueHolder"
-      },
-      "retarget_lib_member": {
-        "java.util.Arrays#stream": "java.util.DesugarArrays",
-        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
-        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet"
-      },
-      "dont_rewrite": [
-        "java.util.Iterator#remove"
-      ],
-      "emulate_interface": {
-        "java.lang.Iterable": "j$.lang.Iterable",
-        "java.util.Map$Entry": "j$.util.Map$Entry",
-        "java.util.Collection": "j$.util.Collection",
-        "java.util.Map": "j$.util.Map",
-        "java.util.Iterator": "j$.util.Iterator",
-        "java.util.Comparator": "j$.util.Comparator",
-        "java.util.List": "j$.util.List",
-        "java.util.SortedSet": "j$.util.SortedSet",
-        "java.util.Set": "j$.util.Set",
-        "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
-      },
-      "custom_conversion": {
-        "java.util.Optional": "java.util.OptionalConversions",
-        "java.util.OptionalDouble": "java.util.OptionalConversions",
-        "java.util.OptionalInt": "java.util.OptionalConversions",
-        "java.util.OptionalLong": "java.util.OptionalConversions",
-        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
-        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
-        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
-      }
-    },
-    {
-      "api_level_below_or_equal": 18,
-      "rewrite_prefix": {
-        "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
-      },
-      "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "java.lang.DesugarCharacter"
-      }
-    }
-  ],
-  "program_flags": [
-    {
       "api_level_below_or_equal": 10000,
       "rewrite_prefix": {
         "java.net.URLDecoder": "j$.net.URLDecoder",
@@ -223,29 +18,29 @@
         "java.time.": "j$.time.",
         "java.util.Desugar": "j$.util.Desugar"
       },
-      "retarget_lib_member": {
-        "java.util.Calendar#toInstant": "java.util.DesugarCalendar",
-        "java.util.Date#from": "java.util.DesugarDate",
-        "java.util.Date#toInstant": "java.util.DesugarDate",
-        "java.util.GregorianCalendar#from": "java.util.DesugarGregorianCalendar",
-        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
-        "java.util.TimeZone#getTimeZone": "java.util.DesugarTimeZone",
-        "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
+      "retarget_method": {
+        "java.time.Instant java.util.Date#toInstant()": "java.util.DesugarDate",
+        "java.time.ZoneId java.util.TimeZone#toZoneId()": "java.util.DesugarTimeZone",
+        "java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
       },
       "custom_conversion": {
-        "java.time.ZonedDateTime": "java.time.TimeConversions",
-        "java.time.LocalDate": "java.time.TimeConversions",
         "java.time.Duration": "java.time.TimeConversions",
-        "java.time.ZoneId": "java.time.TimeConversions",
+        "java.time.Instant": "java.time.TimeConversions",
+        "java.time.LocalDate": "java.time.TimeConversions",
         "java.time.MonthDay": "java.time.TimeConversions",
-        "java.time.Instant": "java.time.TimeConversions"
+        "java.time.ZoneId": "java.time.TimeConversions",
+        "java.time.ZonedDateTime": "java.time.TimeConversions"
       }
     },
     {
+      "api_level_below_or_equal": 25,
+      "wrapper_conversion": [
+        "java.time.Clock"
+      ]
+    },
+    {
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
-        "java.util.stream.": "j$.util.stream.",
-        "java.util.function.": "j$.util.function.",
         "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
         "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
         "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
@@ -253,61 +48,245 @@
         "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
         "java.util.Spliterator": "j$.util.Spliterator",
         "java.util.StringJoiner": "j$.util.StringJoiner",
+        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
         "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
         "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap"
+        "java.util.function.": "j$.util.function.",
+        "java.util.stream.": "j$.util.stream."
       },
-      "retarget_lib_member": {
-        "java.util.Arrays#stream": "java.util.DesugarArrays",
-        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
-        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet",
-        "java.util.concurrent.atomic.AtomicInteger#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicLong#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicReference#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.Collections#synchronizedMap": "java.util.DesugarCollections",
-        "java.util.Collections#synchronizedSortedMap": "java.util.DesugarCollections"
-      },
-      "dont_rewrite": [
-        "java.util.Iterator#remove"
-      ],
       "emulate_interface": {
         "java.lang.Iterable": "j$.lang.Iterable",
-        "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Collection": "j$.util.Collection",
-        "java.util.Map": "j$.util.Map",
-        "java.util.Iterator": "j$.util.Iterator",
         "java.util.Comparator": "j$.util.Comparator",
+        "java.util.Iterator": "j$.util.Iterator",
         "java.util.List": "j$.util.List",
-        "java.util.SortedSet": "j$.util.SortedSet",
+        "java.util.Map": "j$.util.Map",
+        "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Set": "j$.util.Set",
+        "java.util.SortedSet": "j$.util.SortedSet",
         "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
       },
+      "dont_rewrite": [
+        "void java.util.Iterator#remove()"
+      ],
+      "retarget_method": {
+        "java.util.Spliterator java.util.Arrays#spliterator(java.lang.Object[])": "java.util.DesugarArrays",
+        "java.util.Spliterator java.util.Arrays#spliterator(java.lang.Object[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet",
+        "java.util.Spliterator$OfDouble java.util.Arrays#spliterator(double[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfDouble java.util.Arrays#spliterator(double[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfInt java.util.Arrays#spliterator(int[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfInt java.util.Arrays#spliterator(int[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfLong java.util.Arrays#spliterator(long[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfLong java.util.Arrays#spliterator(long[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.DoubleStream java.util.Arrays#stream(double[])": "java.util.DesugarArrays",
+        "java.util.stream.DoubleStream java.util.Arrays#stream(double[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.IntStream java.util.Arrays#stream(int[])": "java.util.DesugarArrays",
+        "java.util.stream.IntStream java.util.Arrays#stream(int[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.LongStream java.util.Arrays#stream(long[])": "java.util.DesugarArrays",
+        "java.util.stream.LongStream java.util.Arrays#stream(long[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.Stream java.util.Arrays#stream(java.lang.Object[])": "java.util.DesugarArrays",
+        "java.util.stream.Stream java.util.Arrays#stream(java.lang.Object[], int, int)": "java.util.DesugarArrays"
+      },
+      "wrapper_conversion": [
+        "java.util.function.IntUnaryOperator",
+        "java.util.function.BiFunction",
+        "java.util.function.IntConsumer",
+        "java.util.function.IntBinaryOperator",
+        "java.util.function.UnaryOperator",
+        "java.util.function.DoubleConsumer",
+        "java.util.function.IntPredicate",
+        "java.util.Spliterator$OfLong",
+        "java.util.stream.Collector",
+        "java.util.function.LongPredicate",
+        "java.util.function.ToLongFunction",
+        "java.util.function.LongToDoubleFunction",
+        "java.util.PrimitiveIterator$OfInt",
+        "java.util.function.LongToIntFunction",
+        "java.util.function.Predicate",
+        "java.util.Spliterator$OfPrimitive",
+        "java.util.function.DoubleToIntFunction",
+        "java.util.function.ObjDoubleConsumer",
+        "java.util.function.BinaryOperator",
+        "java.util.stream.DoubleStream",
+        "java.util.Spliterator$OfInt",
+        "java.util.stream.Stream",
+        "java.util.function.ObjLongConsumer",
+        "java.util.function.ToDoubleFunction",
+        "java.util.Spliterator",
+        "java.util.stream.IntStream",
+        "java.util.function.LongBinaryOperator",
+        "java.util.Spliterator$OfDouble",
+        "java.util.function.DoubleFunction",
+        "java.util.function.ObjIntConsumer",
+        "java.util.function.Function",
+        "java.util.function.Supplier",
+        "java.util.function.DoubleUnaryOperator",
+        "java.util.function.BiPredicate",
+        "java.util.PrimitiveIterator$OfDouble",
+        "java.util.function.DoubleBinaryOperator",
+        "java.util.PrimitiveIterator$OfLong",
+        "java.util.function.BiConsumer",
+        "java.util.function.IntFunction",
+        "java.util.stream.LongStream",
+        "java.util.function.IntToDoubleFunction",
+        "java.util.function.LongFunction",
+        "java.util.function.ToIntFunction",
+        "java.util.function.LongConsumer",
+        "java.util.function.Consumer",
+        "java.util.function.IntToLongFunction",
+        "java.util.function.DoubleToLongFunction",
+        "java.util.function.LongUnaryOperator",
+        "java.util.stream.BaseStream",
+        "java.util.function.DoublePredicate"
+      ],
       "custom_conversion": {
+        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions",
+        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
+        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
         "java.util.Optional": "java.util.OptionalConversions",
         "java.util.OptionalDouble": "java.util.OptionalConversions",
         "java.util.OptionalInt": "java.util.OptionalConversions",
-        "java.util.OptionalLong": "java.util.OptionalConversions",
-        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
-        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
-        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
+        "java.util.OptionalLong": "java.util.OptionalConversions"
       }
     },
     {
       "api_level_below_or_equal": 18,
       "rewrite_prefix": {
         "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+      }
+    }
+  ],
+  "program_flags": [
+    {
+      "api_level_below_or_equal": 30,
+      "retarget_method": {
+        "java.time.Instant java.util.Calendar#toInstant()": "java.util.DesugarCalendar",
+        "java.util.Date java.util.Date#from(java.time.Instant)": "java.util.DesugarDate",
+        "java.util.GregorianCalendar java.util.GregorianCalendar#from(java.time.ZonedDateTime)": "java.util.DesugarGregorianCalendar",
+        "java.util.TimeZone java.util.TimeZone#getTimeZone(java.lang.String)": "java.util.DesugarTimeZone",
+        "java.util.TimeZone java.util.TimeZone#getTimeZone(java.time.ZoneId)": "java.util.DesugarTimeZone"
+      }
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "retarget_method": {
+        "int java.util.concurrent.atomic.AtomicInteger#accumulateAndGet(int, java.util.function.IntBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#getAndAccumulate(int, java.util.function.IntBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#getAndUpdate(java.util.function.IntUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#updateAndGet(java.util.function.IntUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#accumulateAndGet(java.lang.Object, java.util.function.BinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#getAndAccumulate(java.lang.Object, java.util.function.BinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#getAndUpdate(java.util.function.UnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#updateAndGet(java.util.function.UnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.util.Map java.util.Collections#synchronizedMap(java.util.Map)": "java.util.DesugarCollections",
+        "java.util.SortedMap java.util.Collections#synchronizedSortedMap(java.util.SortedMap)": "java.util.DesugarCollections",
+        "long java.util.concurrent.atomic.AtomicLong#accumulateAndGet(long, java.util.function.LongBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#getAndAccumulate(long, java.util.function.LongBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#getAndUpdate(java.util.function.LongUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#updateAndGet(java.util.function.LongUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong"
+      }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "retarget_method": {
+        "boolean java.lang.Character#isBmpCodePoint(int)": "j$.lang.DesugarCharacter"
+      }
+    }
+  ],
+  "library_flags": [
+    {
+      "api_level_below_or_equal": 10000,
+      "rewrite_prefix": {
+        "desugar.": "j$.desugar.",
+        "java.lang.Desugar": "j$.lang.Desugar",
+        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
+        "libcore.": "j$.libcore.",
+        "sun.security.action.": "j$.sun.security.action."
+      }
+    },
+    {
+      "api_level_below_or_equal": 30,
+      "rewrite_derived_prefix": {
+        "java.time.": {
+          "j$.time.": "java.time."
+        }
+      }
+    },
+    {
+      "api_level_below_or_equal": 29,
+      "rewrite_prefix": {
+        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+      }
+    },
+    {
+      "api_level_below_or_equal": 25,
+      "rewrite_prefix": {
+        "java.io.DesugarFile": "j$.io.DesugarFile",
+        "java.nio.Desugar": "j$.nio.Desugar",
+        "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
+        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+        "java.nio.file.": "j$.nio.file.",
+        "jdk.internal.": "j$.jdk.internal.",
+        "sun.misc.Desugar": "j$.sun.misc.Desugar",
+        "sun.nio.cs.": "j$.sun.nio.cs.",
+        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
       },
-      "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+      "retarget_method": {
+        "boolean java.util.Arrays#deepEquals0(java.lang.Object, java.lang.Object)": "java.util.DesugarArrays",
+        "java.nio.file.Path java.io.File#toPath()": "java.io.DesugarFile",
+        "java.util.TimeZone java.util.TimeZone#getTimeZone(java.time.ZoneId)": "java.util.DesugarTimeZone"
+      },
+      "backport": {
+        "java.lang.DesugarDouble": "java.lang.Double",
+        "java.lang.DesugarInteger": "java.lang.Integer",
+        "java.lang.DesugarLong": "java.lang.Long",
+        "java.lang.DesugarMath": "java.lang.Math"
+      },
+      "amend_library_method": [
+        "private static boolean java.util.Arrays#deepEquals0(java.lang.Object, java.lang.Object)"
+      ]
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "rewrite_prefix": {
+        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
+        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
+        "java.util.AbstractList": "j$.util.AbstractList",
+        "java.util.CollSer": "j$.util.CollSer",
+        "java.util.Comparators": "j$.util.Comparators",
+        "java.util.ImmutableCollections": "j$.util.ImmutableCollections",
+        "java.util.KeyValueHolder": "j$.util.KeyValueHolder",
+        "java.util.SortedSet$1": "j$.util.SortedSet$1",
+        "java.util.Tripwire": "j$.util.Tripwire",
+        "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers"
+      },
+      "rewrite_derived_prefix": {
+        "java.util.DoubleSummaryStatistics": {
+          "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics"
+        },
+        "java.util.IntSummaryStatistics": {
+          "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics"
+        },
+        "java.util.LongSummaryStatistics": {
+          "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics"
+        },
+        "java.util.Optional": {
+          "j$.util.Optional": "java.util.Optional"
+        }
+      }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "retarget_method": {
+        "boolean java.lang.Character#isBmpCodePoint(int)": "java.lang.DesugarCharacter"
       }
     }
   ],
@@ -326,4 +305,4 @@
     "-keepattributes InnerClasses",
     "-dontwarn sun.misc.Unsafe"
   ]
-}
+}
\ No newline at end of file
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
index 1482909..890f449 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -1,220 +1,11 @@
 {
-  "configuration_format_version": 3,
-  "group_id" : "com.tools.android",
-  "artifact_id" : "desugar_jdk_libs_alternative_3",
-  "version": "2.0.0",
+  "identifier": "com.tools.android:desugar_jdk_libs_alternative_3:2.0.0",
+  "configuration_format_version": 100,
   "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
     {
-      "api_level_below_or_equal": 25,
-      "wrapper_conversion": [
-        "java.time.Clock"
-      ]
-    },
-    {
-      "api_level_below_or_equal": 23,
-      "wrapper_conversion": [
-        "java.util.PrimitiveIterator$OfDouble",
-        "java.util.PrimitiveIterator$OfInt",
-        "java.util.PrimitiveIterator$OfLong",
-        "java.util.Spliterator",
-        "java.util.Spliterator$OfDouble",
-        "java.util.Spliterator$OfInt",
-        "java.util.Spliterator$OfLong",
-        "java.util.Spliterator$OfPrimitive",
-        "java.util.function.BiConsumer",
-        "java.util.function.BiFunction",
-        "java.util.function.BiPredicate",
-        "java.util.function.BinaryOperator",
-        "java.util.function.Consumer",
-        "java.util.function.DoubleBinaryOperator",
-        "java.util.function.DoubleConsumer",
-        "java.util.function.DoubleFunction",
-        "java.util.function.DoublePredicate",
-        "java.util.function.DoubleToIntFunction",
-        "java.util.function.DoubleToLongFunction",
-        "java.util.function.DoubleUnaryOperator",
-        "java.util.function.Function",
-        "java.util.function.IntBinaryOperator",
-        "java.util.function.IntConsumer",
-        "java.util.function.IntFunction",
-        "java.util.function.IntPredicate",
-        "java.util.function.IntToDoubleFunction",
-        "java.util.function.IntToLongFunction",
-        "java.util.function.IntUnaryOperator",
-        "java.util.function.LongBinaryOperator",
-        "java.util.function.LongConsumer",
-        "java.util.function.LongFunction",
-        "java.util.function.LongPredicate",
-        "java.util.function.LongToDoubleFunction",
-        "java.util.function.LongToIntFunction",
-        "java.util.function.LongUnaryOperator",
-        "java.util.function.ObjDoubleConsumer",
-        "java.util.function.ObjIntConsumer",
-        "java.util.function.ObjLongConsumer",
-        "java.util.function.Predicate",
-        "java.util.function.Supplier",
-        "java.util.function.ToDoubleFunction",
-        "java.util.function.ToIntFunction",
-        "java.util.function.ToLongFunction",
-        "java.util.function.UnaryOperator",
-        "java.util.stream.BaseStream",
-        "java.util.stream.Collector",
-        "java.util.stream.DoubleStream",
-        "java.util.stream.IntStream",
-        "java.util.stream.LongStream",
-        "java.util.stream.Stream"
-      ]
-    }
-  ],
-  "library_flags": [
-    {
-      "api_level_below_or_equal": 10000,
-      "rewrite_prefix": {
-        "desugar.": "j$.desugar.",
-        "libcore.": "j$.libcore.",
-        "java.net.URLDecoder": "j$.net.URLDecoder",
-        "java.net.URLEncoder": "j$.net.URLEncoder",
-        "java.lang.Desugar": "j$.lang.Desugar",
-        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
-        "sun.security.action.": "j$.sun.security.action."
-      }
-    },
-    {
-      "api_level_below_or_equal": 30,
-      "rewrite_prefix": {
-        "j$.time.": "java.time.",
-        "java.time.": "j$.time.",
-        "java.util.Desugar": "j$.util.Desugar"
-      },
-      "retarget_lib_member": {
-        "java.util.Date#toInstant": "java.util.DesugarDate",
-        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
-        "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
-      },
-      "custom_conversion": {
-        "java.time.ZonedDateTime": "java.time.TimeConversions",
-        "java.time.LocalDate": "java.time.TimeConversions",
-        "java.time.Duration": "java.time.TimeConversions",
-        "java.time.ZoneId": "java.time.TimeConversions",
-        "java.time.MonthDay": "java.time.TimeConversions",
-        "java.time.Instant": "java.time.TimeConversions"
-      }
-    },
-    {
-      "api_level_below_or_equal": 29,
-      "rewrite_prefix": {
-        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
-      }
-    },
-    {
-      "api_level_below_or_equal": 30,
-      "rewrite_prefix": {
-        "java.io.DesugarFile" : "j$.io.DesugarFile",
-        "sun.misc.Desugar": "j$.sun.misc.Desugar",
-        "jdk.internal.": "j$.jdk.internal.",
-        "java.nio.Desugar": "j$.nio.Desugar",
-        "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
-        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
-        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
-        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
-        "java.nio.file.": "j$.nio.file.",
-        "sun.nio.cs." : "j$.sun.nio.cs.",
-        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
-        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
-        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
-        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
-        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
-      },
-      "backport": {
-        "java.lang.DesugarDouble": "java.lang.Double",
-        "java.lang.DesugarInteger": "java.lang.Integer",
-        "java.lang.DesugarLong": "java.lang.Long",
-        "java.lang.DesugarMath": "java.lang.Math"
-      },
-      "retarget_lib_member": {
-        "java.io.File#toPath": "java.io.DesugarFile"
-      }
-    },
-    {
-      "api_level_below_or_equal": 23,
-      "rewrite_prefix": {
-        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
-        "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
-        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
-        "java.io.UncheckedIOException": "j$.io.UncheckedIOException",
-        "j$.util.Optional": "java.util.Optional",
-        "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
-        "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
-        "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
-        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
-        "java.util.stream.": "j$.util.stream.",
-        "java.util.function.": "j$.util.function.",
-        "java.util.Comparators": "j$.util.Comparators",
-        "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
-        "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
-        "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
-        "java.util.Objects": "j$.util.Objects",
-        "java.util.Optional": "j$.util.Optional",
-        "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
-        "java.util.SortedSet$1": "j$.util.SortedSet$1",
-        "java.util.Spliterator": "j$.util.Spliterator",
-        "java.util.StringJoiner": "j$.util.StringJoiner",
-        "java.util.Tripwire": "j$.util.Tripwire",
-        "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers",
-        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
-        "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
-        "java.util.AbstractList": "j$.util.AbstractList",
-        "java.util.CollSer": "j$.util.CollSer",
-        "java.util.ImmutableCollections": "j$.util.ImmutableCollections",
-        "java.util.KeyValueHolder": "j$.util.KeyValueHolder"
-      },
-      "retarget_lib_member": {
-        "java.util.Arrays#stream": "java.util.DesugarArrays",
-        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
-        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet",
-        "java.io.BufferedReader#lines": "java.io.DesugarBufferedReader"
-      },
-      "dont_rewrite": [
-        "java.util.Iterator#remove"
-      ],
-      "emulate_interface": {
-        "java.lang.Iterable": "j$.lang.Iterable",
-        "java.util.Map$Entry": "j$.util.Map$Entry",
-        "java.util.Collection": "j$.util.Collection",
-        "java.util.Map": "j$.util.Map",
-        "java.util.Iterator": "j$.util.Iterator",
-        "java.util.Comparator": "j$.util.Comparator",
-        "java.util.List": "j$.util.List",
-        "java.util.SortedSet": "j$.util.SortedSet",
-        "java.util.Set": "j$.util.Set",
-        "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
-      },
-      "custom_conversion": {
-        "java.util.Optional": "java.util.OptionalConversions",
-        "java.util.OptionalDouble": "java.util.OptionalConversions",
-        "java.util.OptionalInt": "java.util.OptionalConversions",
-        "java.util.OptionalLong": "java.util.OptionalConversions",
-        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
-        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
-        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
-      }
-    },
-    {
-      "api_level_below_or_equal": 18,
-      "rewrite_prefix": {
-        "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
-      },
-      "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "java.lang.DesugarCharacter"
-      }
-    }
-  ],
-  "program_flags": [
-    {
       "api_level_below_or_equal": 10000,
       "rewrite_prefix": {
         "java.net.URLDecoder": "j$.net.URLDecoder",
@@ -227,29 +18,30 @@
         "java.time.": "j$.time.",
         "java.util.Desugar": "j$.util.Desugar"
       },
-      "retarget_lib_member": {
-        "java.util.Calendar#toInstant": "java.util.DesugarCalendar",
-        "java.util.Date#from": "java.util.DesugarDate",
-        "java.util.Date#toInstant": "java.util.DesugarDate",
-        "java.util.GregorianCalendar#from": "java.util.DesugarGregorianCalendar",
-        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
-        "java.util.TimeZone#getTimeZone": "java.util.DesugarTimeZone",
-        "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
+      "retarget_method": {
+        "java.time.Instant java.util.Date#toInstant()": "java.util.DesugarDate",
+        "java.time.ZoneId java.util.TimeZone#toZoneId()": "java.util.DesugarTimeZone",
+        "java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
       },
       "custom_conversion": {
-        "java.time.ZonedDateTime": "java.time.TimeConversions",
-        "java.time.LocalDate": "java.time.TimeConversions",
         "java.time.Duration": "java.time.TimeConversions",
-        "java.time.ZoneId": "java.time.TimeConversions",
+        "java.time.Instant": "java.time.TimeConversions",
+        "java.time.LocalDate": "java.time.TimeConversions",
         "java.time.MonthDay": "java.time.TimeConversions",
-        "java.time.Instant": "java.time.TimeConversions"
+        "java.time.ZoneId": "java.time.TimeConversions",
+        "java.time.ZonedDateTime": "java.time.TimeConversions"
       }
     },
     {
+      "api_level_below_or_equal": 25,
+      "wrapper_conversion": [
+        "java.time.Clock"
+      ]
+    },
+    {
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
-        "java.util.stream.": "j$.util.stream.",
-        "java.util.function.": "j$.util.function.",
+        "java.io.UncheckedIOException": "j$.io.UncheckedIOException",
         "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
         "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
         "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
@@ -258,63 +50,239 @@
         "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
         "java.util.Spliterator": "j$.util.Spliterator",
         "java.util.StringJoiner": "j$.util.StringJoiner",
+        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
         "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
         "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
-        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
-        "java.io.UncheckedIOException": "j$.io.UncheckedIOException"
+        "java.util.function.": "j$.util.function.",
+        "java.util.stream.": "j$.util.stream."
       },
-      "retarget_lib_member": {
-        "java.util.Arrays#stream": "java.util.DesugarArrays",
-        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
-        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet",
-        "java.util.concurrent.atomic.AtomicInteger#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicInteger#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
-        "java.util.concurrent.atomic.AtomicLong#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicLong#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
-        "java.util.concurrent.atomic.AtomicReference#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.concurrent.atomic.AtomicReference#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference",
-        "java.util.Collections#synchronizedMap": "java.util.DesugarCollections",
-        "java.util.Collections#synchronizedSortedMap": "java.util.DesugarCollections",
-        "java.io.BufferedReader#lines": "java.io.DesugarBufferedReader"
-      },
-      "dont_rewrite": [
-        "java.util.Iterator#remove"
-      ],
       "emulate_interface": {
         "java.lang.Iterable": "j$.lang.Iterable",
-        "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Collection": "j$.util.Collection",
-        "java.util.Map": "j$.util.Map",
-        "java.util.Iterator": "j$.util.Iterator",
         "java.util.Comparator": "j$.util.Comparator",
+        "java.util.Iterator": "j$.util.Iterator",
         "java.util.List": "j$.util.List",
-        "java.util.SortedSet": "j$.util.SortedSet",
+        "java.util.Map": "j$.util.Map",
+        "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Set": "j$.util.Set",
+        "java.util.SortedSet": "j$.util.SortedSet",
         "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
       },
+      "dont_rewrite": [
+        "void java.util.Iterator#remove()"
+      ],
+      "retarget_method": {
+        "java.util.Spliterator java.util.Arrays#spliterator(java.lang.Object[])": "java.util.DesugarArrays",
+        "java.util.Spliterator java.util.Arrays#spliterator(java.lang.Object[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator java.util.LinkedHashSet#spliterator()": "java.util.DesugarLinkedHashSet",
+        "java.util.Spliterator$OfDouble java.util.Arrays#spliterator(double[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfDouble java.util.Arrays#spliterator(double[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfInt java.util.Arrays#spliterator(int[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfInt java.util.Arrays#spliterator(int[], int, int)": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfLong java.util.Arrays#spliterator(long[])": "java.util.DesugarArrays",
+        "java.util.Spliterator$OfLong java.util.Arrays#spliterator(long[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.DoubleStream java.util.Arrays#stream(double[])": "java.util.DesugarArrays",
+        "java.util.stream.DoubleStream java.util.Arrays#stream(double[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.IntStream java.util.Arrays#stream(int[])": "java.util.DesugarArrays",
+        "java.util.stream.IntStream java.util.Arrays#stream(int[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.LongStream java.util.Arrays#stream(long[])": "java.util.DesugarArrays",
+        "java.util.stream.LongStream java.util.Arrays#stream(long[], int, int)": "java.util.DesugarArrays",
+        "java.util.stream.Stream java.io.BufferedReader#lines()": "java.io.DesugarBufferedReader",
+        "java.util.stream.Stream java.util.Arrays#stream(java.lang.Object[])": "java.util.DesugarArrays",
+        "java.util.stream.Stream java.util.Arrays#stream(java.lang.Object[], int, int)": "java.util.DesugarArrays"
+      },
+      "wrapper_conversion": [
+        "java.util.function.IntUnaryOperator",
+        "java.util.function.BiFunction",
+        "java.util.function.IntConsumer",
+        "java.util.function.IntBinaryOperator",
+        "java.util.function.UnaryOperator",
+        "java.util.function.IntPredicate",
+        "java.util.function.DoubleConsumer",
+        "java.util.Spliterator$OfLong",
+        "java.util.stream.Collector",
+        "java.util.function.LongPredicate",
+        "java.util.function.ToLongFunction",
+        "java.util.function.LongToDoubleFunction",
+        "java.util.function.LongToIntFunction",
+        "java.util.PrimitiveIterator$OfInt",
+        "java.util.function.Predicate",
+        "java.util.Spliterator$OfPrimitive",
+        "java.util.function.DoubleToIntFunction",
+        "java.util.function.ObjDoubleConsumer",
+        "java.util.function.BinaryOperator",
+        "java.util.stream.DoubleStream",
+        "java.util.Spliterator$OfInt",
+        "java.util.stream.Stream",
+        "java.util.function.ObjLongConsumer",
+        "java.util.function.ToDoubleFunction",
+        "java.util.Spliterator",
+        "java.util.stream.IntStream",
+        "java.util.function.LongBinaryOperator",
+        "java.util.function.DoubleFunction",
+        "java.util.Spliterator$OfDouble",
+        "java.util.function.ObjIntConsumer",
+        "java.util.function.Function",
+        "java.util.function.Supplier",
+        "java.util.function.DoubleUnaryOperator",
+        "java.util.function.BiPredicate",
+        "java.util.PrimitiveIterator$OfDouble",
+        "java.util.function.DoubleBinaryOperator",
+        "java.util.PrimitiveIterator$OfLong",
+        "java.util.function.BiConsumer",
+        "java.util.function.IntFunction",
+        "java.util.function.IntToDoubleFunction",
+        "java.util.stream.LongStream",
+        "java.util.function.LongFunction",
+        "java.util.function.ToIntFunction",
+        "java.util.function.LongConsumer",
+        "java.util.function.Consumer",
+        "java.util.function.IntToLongFunction",
+        "java.util.function.DoubleToLongFunction",
+        "java.util.function.LongUnaryOperator",
+        "java.util.stream.BaseStream",
+        "java.util.function.DoublePredicate"
+      ],
       "custom_conversion": {
+        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions",
+        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
+        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
         "java.util.Optional": "java.util.OptionalConversions",
         "java.util.OptionalDouble": "java.util.OptionalConversions",
         "java.util.OptionalInt": "java.util.OptionalConversions",
-        "java.util.OptionalLong": "java.util.OptionalConversions",
-        "java.util.LongSummaryStatistics": "java.util.LongSummaryStatisticsConversions",
-        "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
-        "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
+        "java.util.OptionalLong": "java.util.OptionalConversions"
       }
     },
     {
       "api_level_below_or_equal": 18,
       "rewrite_prefix": {
         "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+      }
+    }
+  ],
+  "program_flags": [
+    {
+      "api_level_below_or_equal": 30,
+      "retarget_method": {
+        "java.time.Instant java.util.Calendar#toInstant()": "java.util.DesugarCalendar",
+        "java.util.Date java.util.Date#from(java.time.Instant)": "java.util.DesugarDate",
+        "java.util.GregorianCalendar java.util.GregorianCalendar#from(java.time.ZonedDateTime)": "java.util.DesugarGregorianCalendar",
+        "java.util.TimeZone java.util.TimeZone#getTimeZone(java.lang.String)": "java.util.DesugarTimeZone",
+        "java.util.TimeZone java.util.TimeZone#getTimeZone(java.time.ZoneId)": "java.util.DesugarTimeZone"
+      }
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "retarget_method": {
+        "int java.util.concurrent.atomic.AtomicInteger#accumulateAndGet(int, java.util.function.IntBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#getAndAccumulate(int, java.util.function.IntBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#getAndUpdate(java.util.function.IntUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "int java.util.concurrent.atomic.AtomicInteger#updateAndGet(java.util.function.IntUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#accumulateAndGet(java.lang.Object, java.util.function.BinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#getAndAccumulate(java.lang.Object, java.util.function.BinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#getAndUpdate(java.util.function.UnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.lang.Object java.util.concurrent.atomic.AtomicReference#updateAndGet(java.util.function.UnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.util.Map java.util.Collections#synchronizedMap(java.util.Map)": "java.util.DesugarCollections",
+        "java.util.SortedMap java.util.Collections#synchronizedSortedMap(java.util.SortedMap)": "java.util.DesugarCollections",
+        "long java.util.concurrent.atomic.AtomicLong#accumulateAndGet(long, java.util.function.LongBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#getAndAccumulate(long, java.util.function.LongBinaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#getAndUpdate(java.util.function.LongUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "long java.util.concurrent.atomic.AtomicLong#updateAndGet(java.util.function.LongUnaryOperator)": "java.util.concurrent.atomic.DesugarAtomicLong"
+      }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "retarget_method": {
+        "boolean java.lang.Character#isBmpCodePoint(int)": "j$.lang.DesugarCharacter"
+      }
+    }
+  ],
+  "library_flags": [
+    {
+      "api_level_below_or_equal": 10000,
+      "rewrite_prefix": {
+        "desugar.": "j$.desugar.",
+        "java.lang.Desugar": "j$.lang.Desugar",
+        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
+        "libcore.": "j$.libcore.",
+        "sun.security.action.": "j$.sun.security.action."
+      }
+    },
+    {
+      "api_level_below_or_equal": 30,
+      "rewrite_prefix": {
+        "java.io.DesugarFile": "j$.io.DesugarFile",
+        "java.nio.Desugar": "j$.nio.Desugar",
+        "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
+        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+        "java.nio.file.": "j$.nio.file.",
+        "jdk.internal.": "j$.jdk.internal.",
+        "sun.misc.Desugar": "j$.sun.misc.Desugar",
+        "sun.nio.cs.": "j$.sun.nio.cs.",
+        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
       },
-      "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+      "rewrite_derived_prefix": {
+        "java.time.": {
+          "j$.time.": "java.time."
+        }
+      },
+      "retarget_method": {
+        "java.nio.file.Path java.io.File#toPath()": "java.io.DesugarFile"
+      },
+      "backport": {
+        "java.lang.DesugarDouble": "java.lang.Double",
+        "java.lang.DesugarInteger": "java.lang.Integer",
+        "java.lang.DesugarLong": "java.lang.Long",
+        "java.lang.DesugarMath": "java.lang.Math"
+      }
+    },
+    {
+      "api_level_below_or_equal": 29,
+      "rewrite_prefix": {
+        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+      }
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "rewrite_prefix": {
+        "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
+        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
+        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
+        "java.util.AbstractList": "j$.util.AbstractList",
+        "java.util.CollSer": "j$.util.CollSer",
+        "java.util.Comparators": "j$.util.Comparators",
+        "java.util.ImmutableCollections": "j$.util.ImmutableCollections",
+        "java.util.KeyValueHolder": "j$.util.KeyValueHolder",
+        "java.util.SortedSet$1": "j$.util.SortedSet$1",
+        "java.util.Tripwire": "j$.util.Tripwire",
+        "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers"
+      },
+      "rewrite_derived_prefix": {
+        "java.util.DoubleSummaryStatistics": {
+          "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics"
+        },
+        "java.util.IntSummaryStatistics": {
+          "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics"
+        },
+        "java.util.LongSummaryStatistics": {
+          "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics"
+        },
+        "java.util.Optional": {
+          "j$.util.Optional": "java.util.Optional"
+        }
+      }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "retarget_method": {
+        "boolean java.lang.Character#isBmpCodePoint(int)": "java.lang.DesugarCharacter"
       }
     }
   ],
@@ -332,4 +300,4 @@
     "-keepattributes InnerClasses",
     "-dontwarn sun.misc.Unsafe"
   ]
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index 37c50c4..c062f43 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -85,7 +85,10 @@
       throws Exception {
     DesugaredLibrarySpecification desugaredLibrarySpecification =
         readDesugaredLibraryConfiguration(desugarConfigurationPath);
-    assert desugaredLibrarySpecification.isLegacy();
+    if (!desugaredLibrarySpecification.isLegacy()) {
+      // TODO(b/184026720): To implement by forcing conversion to machine spec.
+      throw new Exception("Generation of lint files not supported from non legacy specification");
+    }
     this.desugaredLibrarySpecification =
         desugaredLibrarySpecification.asLegacyDesugaredLibrarySpecification();
     this.desugaredLibraryImplementation = Paths.get(desugarImplementationPath);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
index d5740de..64a141e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
@@ -28,6 +28,8 @@
 
   boolean isEmpty();
 
+  boolean isLibraryCompilation();
+
   String getJsonSource();
 
   String getSynthesizedLibraryClassesPackagePrefix();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecificationParser.java
index c614166..83ee3ec 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecificationParser.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import java.util.function.Consumer;
 
 public class DesugaredLibrarySpecificationParser {
 
@@ -37,6 +38,47 @@
     } catch (Exception e) {
       throw reporter.fatalError(new ExceptionDiagnostic(e, origin));
     }
+
+    if (isHumanSpecification(jsonConfig, reporter, origin)) {
+      return new HumanDesugaredLibrarySpecificationParser(
+              dexItemFactory, reporter, libraryCompilation, minAPILevel)
+          .parse(origin, jsonConfigString, jsonConfig);
+    }
+    return new LegacyDesugaredLibrarySpecificationParser(
+            dexItemFactory, reporter, libraryCompilation, minAPILevel)
+        .parse(origin, jsonConfigString, jsonConfig);
+  }
+
+  public static DesugaredLibrarySpecification parseDesugaredLibrarySpecificationforTesting(
+      StringResource stringResource,
+      DexItemFactory dexItemFactory,
+      Reporter reporter,
+      boolean libraryCompilation,
+      int minAPILevel,
+      Consumer<TopLevelFlagsBuilder<?>> topLevelFlagsAmender) {
+    Origin origin = stringResource.getOrigin();
+    assert origin != null;
+    String jsonConfigString;
+    JsonObject jsonConfig;
+    try {
+      jsonConfigString = stringResource.getString();
+      JsonParser parser = new JsonParser();
+      jsonConfig = parser.parse(jsonConfigString).getAsJsonObject();
+    } catch (Exception e) {
+      throw reporter.fatalError(new ExceptionDiagnostic(e, origin));
+    }
+    if (isHumanSpecification(jsonConfig, reporter, origin)) {
+      return new HumanDesugaredLibrarySpecificationParser(
+              dexItemFactory, reporter, libraryCompilation, minAPILevel)
+          .parse(origin, jsonConfigString, jsonConfig, topLevelFlagsAmender);
+    }
+    return new LegacyDesugaredLibrarySpecificationParser(
+            dexItemFactory, reporter, libraryCompilation, minAPILevel)
+        .parse(origin, jsonConfigString, jsonConfig, topLevelFlagsAmender);
+  }
+
+  public static boolean isHumanSpecification(
+      JsonObject jsonConfig, Reporter reporter, Origin origin) {
     if (!jsonConfig.has(CONFIGURATION_FORMAT_VERSION_KEY)) {
       throw reporter.fatalError(
           new StringDiagnostic(
@@ -46,14 +88,7 @@
               origin));
     }
 
-    if (jsonConfig.get(CONFIGURATION_FORMAT_VERSION_KEY).getAsInt()
-        >= MIN_HUMAN_CONFIGURATION_FORMAT_VERSION) {
-      return new HumanDesugaredLibrarySpecificationParser(
-              dexItemFactory, reporter, libraryCompilation, minAPILevel)
-          .parse(origin, jsonConfigString, jsonConfig);
-    }
-    return new LegacyDesugaredLibrarySpecificationParser(
-            dexItemFactory, reporter, libraryCompilation, minAPILevel)
-        .parse(origin, jsonConfigString, jsonConfig);
+    return jsonConfig.get(CONFIGURATION_FORMAT_VERSION_KEY).getAsInt()
+        >= MIN_HUMAN_CONFIGURATION_FORMAT_VERSION;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/TopLevelFlagsBuilder.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/TopLevelFlagsBuilder.java
new file mode 100644
index 0000000..e7c7bb5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/TopLevelFlagsBuilder.java
@@ -0,0 +1,10 @@
+// Copyright (c) 2022, 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 com.android.tools.r8.ir.desugar.desugaredlibrary;
+
+public interface TopLevelFlagsBuilder<T extends TopLevelFlagsBuilder<?>> {
+
+  T setSupportAllCallbacksFromLibrary(boolean supportAllCallbacksFromLibrary);
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
index 15ec7dd..88de477 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
@@ -52,6 +52,7 @@
     return topLevelFlags.getRequiredCompilationAPILevel();
   }
 
+  @Override
   public boolean isLibraryCompilation() {
     return libraryCompilation;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
index 2aecff0..bb4bc68 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -5,11 +5,13 @@
 package com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification;
 
 import static com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser.CONFIGURATION_FORMAT_VERSION_KEY;
+import static com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser.isHumanSpecification;
 
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.TopLevelFlagsBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -102,13 +104,8 @@
   }
 
   public HumanDesugaredLibrarySpecification parse(StringResource stringResource) {
-    return parse(stringResource, builder -> {});
-  }
-
-  public HumanDesugaredLibrarySpecification parse(
-      StringResource stringResource, Consumer<HumanTopLevelFlags.Builder> topLevelFlagAmender) {
     String jsonConfigString = parseJson(stringResource);
-    return parse(origin, jsonConfigString, jsonConfig, topLevelFlagAmender);
+    return parse(origin, jsonConfigString, jsonConfig, ignored -> {});
   }
 
   public HumanDesugaredLibrarySpecification parse(
@@ -116,11 +113,15 @@
     return parse(origin, jsonConfigString, jsonConfig, ignored -> {});
   }
 
-  private HumanDesugaredLibrarySpecification parse(
+  public HumanDesugaredLibrarySpecification parse(
       Origin origin,
       String jsonConfigString,
       JsonObject jsonConfig,
-      Consumer<HumanTopLevelFlags.Builder> topLevelFlagAmender) {
+      Consumer<TopLevelFlagsBuilder<?>> topLevelFlagAmender) {
+    if (!isHumanSpecification(jsonConfig, reporter, origin)) {
+      reporter.error(
+          "Attempt to parse a non desugared library human specification as a human specification.");
+    }
     this.origin = origin;
     this.jsonConfig = jsonConfig;
     HumanTopLevelFlags topLevelFlags = parseTopLevelFlags(jsonConfigString, topLevelFlagAmender);
@@ -165,7 +166,7 @@
   }
 
   HumanTopLevelFlags parseTopLevelFlags(
-      String jsonConfigString, Consumer<HumanTopLevelFlags.Builder> topLevelFlagAmender) {
+      String jsonConfigString, Consumer<TopLevelFlagsBuilder<?>> topLevelFlagAmender) {
     HumanTopLevelFlags.Builder builder = HumanTopLevelFlags.builder();
 
     builder.setJsonSource(jsonConfigString);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
index d9dd3bc..ece6fe0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -131,7 +131,10 @@
   }
 
   public boolean isEmpty() {
-    return rewritePrefix.isEmpty() && emulatedInterfaces.isEmpty() && retargetMethod.isEmpty();
+    return rewritePrefix.isEmpty()
+        && rewriteDerivedPrefix.isEmpty()
+        && emulatedInterfaces.isEmpty()
+        && retargetMethod.isEmpty();
   }
 
   public static class Builder {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanTopLevelFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanTopLevelFlags.java
index 80a13b5..409cf74 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanTopLevelFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanTopLevelFlags.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification;
 
+import com.android.tools.r8.ir.desugar.desugaredlibrary.TopLevelFlagsBuilder;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -77,7 +78,7 @@
     return extraKeepRules;
   }
 
-  public static class Builder {
+  public static class Builder implements TopLevelFlagsBuilder<Builder> {
 
     private AndroidApiLevel requiredCompilationAPILevel;
     private String synthesizedLibraryClassesPackagePrefix;
@@ -108,6 +109,7 @@
       return this;
     }
 
+    @Override
     public Builder setSupportAllCallbacksFromLibrary(boolean supportAllCallbacksFromLibrary) {
       this.supportAllCallbacksFromLibrary = supportAllCallbacksFromLibrary;
       return this;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
index 4422b66..afc7dd6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
@@ -62,9 +62,19 @@
     deduplicateFlags(library, program, commonBuilder, libraryBuilder);
     deduplicateFlags(program, library, commonBuilder, programBuilder);
 
-    commonFlags.put(api, commonBuilder.build());
-    libraryFlags.put(api, libraryBuilder.build());
-    programFlags.put(api, programBuilder.build());
+    putNewFlags(api, commonFlags, commonBuilder);
+    putNewFlags(api, libraryFlags, libraryBuilder);
+    putNewFlags(api, programFlags, programBuilder);
+  }
+
+  private static void putNewFlags(
+      int api, Int2ObjectMap<HumanRewritingFlags> flags, HumanRewritingFlags.Builder builder) {
+    HumanRewritingFlags build = builder.build();
+    if (build.isEmpty()) {
+      flags.remove(api);
+    } else {
+      flags.put(api, build);
+    }
   }
 
   private static void deduplicateFlags(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.java
index f528446..97749d6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.java
@@ -37,6 +37,7 @@
 import com.google.gson.Gson;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -62,7 +63,7 @@
         humanSpec.getTopLevelFlags().getRequiredCompilationAPILevel().getLevel());
     toJson.put(
         SYNTHESIZED_LIBRARY_CLASSES_PACKAGE_PREFIX_KEY,
-        humanSpec.getTopLevelFlags().getSynthesizedLibraryClassesPackagePrefix());
+        humanSpec.getTopLevelFlags().getSynthesizedLibraryClassesPackagePrefix().replace('/', '.'));
     toJson.put(
         SUPPORT_ALL_CALLBACKS_FROM_LIBRARY_KEY,
         humanSpec.getTopLevelFlags().supportAllCallbacksFromLibrary());
@@ -81,47 +82,48 @@
   private List<Object> rewritingFlagsToString(
       Int2ObjectMap<HumanRewritingFlags> rewritingFlagsMap) {
     ArrayList<Object> list = new ArrayList<>();
-    rewritingFlagsMap.forEach(
-        (apiBelowOrEqual, flags) -> {
-          HashMap<String, Object> toJson = new LinkedHashMap<>();
-          toJson.put(API_LEVEL_BELOW_OR_EQUAL_KEY, apiBelowOrEqual);
-          if (!flags.getRewritePrefix().isEmpty()) {
-            toJson.put(REWRITE_PREFIX_KEY, new TreeMap<>(flags.getRewritePrefix()));
-          }
-          if (!flags.getRewriteDerivedPrefix().isEmpty()) {
-            TreeMap<String, Map<String, String>> rewriteDerivedPrefix = new TreeMap<>();
-            flags
-                .getRewriteDerivedPrefix()
-                .forEach((k, v) -> rewriteDerivedPrefix.put(k, new TreeMap<>(v)));
-            toJson.put(REWRITE_DERIVED_PREFIX_KEY, rewriteDerivedPrefix);
-          }
-          if (!flags.getEmulatedInterfaces().isEmpty()) {
-            toJson.put(EMULATE_INTERFACE_KEY, mapToString(flags.getEmulatedInterfaces()));
-          }
-          if (!flags.getDontRewriteInvocation().isEmpty()) {
-            toJson.put(DONT_REWRITE_KEY, setToString(flags.getDontRewriteInvocation()));
-          }
-          if (!flags.getRetargetMethod().isEmpty()) {
-            toJson.put(RETARGET_METHOD_KEY, mapToString(flags.getRetargetMethod()));
-          }
-          if (!flags.getDontRetarget().isEmpty()) {
-            toJson.put(DONT_RETARGET_KEY, setToString(flags.getDontRetarget()));
-          }
-          if (!flags.getLegacyBackport().isEmpty()) {
-            toJson.put(BACKPORT_KEY, mapToString(flags.getLegacyBackport()));
-          }
-          if (!flags.getWrapperConversions().isEmpty()) {
-            toJson.put(WRAPPER_CONVERSION_KEY, setToString(flags.getWrapperConversions()));
-          }
-          if (!flags.getCustomConversions().isEmpty()) {
-            toJson.put(CUSTOM_CONVERSION_KEY, mapToString(flags.getCustomConversions()));
-          }
-          if (!flags.getAmendLibraryMethod().isEmpty()) {
-            toJson.put(
-                AMEND_LIBRARY_METHOD_KEY, amendLibraryToString(flags.getAmendLibraryMethod()));
-          }
-          list.add(toJson);
-        });
+    ArrayList<Integer> apis = new ArrayList<>(rewritingFlagsMap.keySet());
+    apis.sort(Comparator.reverseOrder());
+    for (int apiBelowOrEqual : apis) {
+      HumanRewritingFlags flags = rewritingFlagsMap.get(apiBelowOrEqual);
+      HashMap<String, Object> toJson = new LinkedHashMap<>();
+      toJson.put(API_LEVEL_BELOW_OR_EQUAL_KEY, apiBelowOrEqual);
+      if (!flags.getRewritePrefix().isEmpty()) {
+        toJson.put(REWRITE_PREFIX_KEY, new TreeMap<>(flags.getRewritePrefix()));
+      }
+      if (!flags.getRewriteDerivedPrefix().isEmpty()) {
+        TreeMap<String, Map<String, String>> rewriteDerivedPrefix = new TreeMap<>();
+        flags
+            .getRewriteDerivedPrefix()
+            .forEach((k, v) -> rewriteDerivedPrefix.put(k, new TreeMap<>(v)));
+        toJson.put(REWRITE_DERIVED_PREFIX_KEY, rewriteDerivedPrefix);
+      }
+      if (!flags.getEmulatedInterfaces().isEmpty()) {
+        toJson.put(EMULATE_INTERFACE_KEY, mapToString(flags.getEmulatedInterfaces()));
+      }
+      if (!flags.getDontRewriteInvocation().isEmpty()) {
+        toJson.put(DONT_REWRITE_KEY, setToString(flags.getDontRewriteInvocation()));
+      }
+      if (!flags.getRetargetMethod().isEmpty()) {
+        toJson.put(RETARGET_METHOD_KEY, mapToString(flags.getRetargetMethod()));
+      }
+      if (!flags.getDontRetarget().isEmpty()) {
+        toJson.put(DONT_RETARGET_KEY, setToString(flags.getDontRetarget()));
+      }
+      if (!flags.getLegacyBackport().isEmpty()) {
+        toJson.put(BACKPORT_KEY, mapToString(flags.getLegacyBackport()));
+      }
+      if (!flags.getWrapperConversions().isEmpty()) {
+        toJson.put(WRAPPER_CONVERSION_KEY, setToString(flags.getWrapperConversions()));
+      }
+      if (!flags.getCustomConversions().isEmpty()) {
+        toJson.put(CUSTOM_CONVERSION_KEY, mapToString(flags.getCustomConversions()));
+      }
+      if (!flags.getAmendLibraryMethod().isEmpty()) {
+        toJson.put(AMEND_LIBRARY_METHOD_KEY, amendLibraryToString(flags.getAmendLibraryMethod()));
+      }
+      list.add(toJson);
+    }
     return list;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
index 8a7df1c..5fbf206 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
@@ -67,6 +67,7 @@
     return topLevelFlags.getRequiredCompilationAPILevel();
   }
 
+  @Override
   public boolean isLibraryCompilation() {
     return libraryCompilation;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
index e6e2094..5b6933d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
@@ -5,9 +5,11 @@
 package com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification;
 
 import static com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser.CONFIGURATION_FORMAT_VERSION_KEY;
+import static com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser.isHumanSpecification;
 
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.TopLevelFlagsBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ExceptionDiagnostic;
@@ -98,13 +100,8 @@
   }
 
   public LegacyDesugaredLibrarySpecification parse(StringResource stringResource) {
-    return parse(stringResource, builder -> {});
-  }
-
-  public LegacyDesugaredLibrarySpecification parse(
-      StringResource stringResource, Consumer<LegacyTopLevelFlags.Builder> topLevelFlagAmender) {
     String jsonConfigString = parseJson(stringResource);
-    return parse(origin, jsonConfigString, jsonConfig, topLevelFlagAmender);
+    return parse(origin, jsonConfigString, jsonConfig, ignored -> {});
   }
 
   public LegacyDesugaredLibrarySpecification parse(
@@ -112,11 +109,15 @@
     return parse(origin, jsonConfigString, jsonConfig, ignored -> {});
   }
 
-  private LegacyDesugaredLibrarySpecification parse(
+  public LegacyDesugaredLibrarySpecification parse(
       Origin origin,
       String jsonConfigString,
       JsonObject jsonConfig,
-      Consumer<LegacyTopLevelFlags.Builder> topLevelFlagAmender) {
+      Consumer<TopLevelFlagsBuilder<?>> topLevelFlagAmender) {
+    if (isHumanSpecification(jsonConfig, reporter, origin)) {
+      reporter.error(
+          "Attempt to parse a desugared library human specification as a legacy specification.");
+    }
     this.origin = origin;
     this.jsonConfig = jsonConfig;
     LegacyTopLevelFlags topLevelFlags = parseTopLevelFlags(jsonConfigString, topLevelFlagAmender);
@@ -162,7 +163,7 @@
   }
 
   LegacyTopLevelFlags parseTopLevelFlags(
-      String jsonConfigString, Consumer<LegacyTopLevelFlags.Builder> topLevelFlagAmender) {
+      String jsonConfigString, Consumer<TopLevelFlagsBuilder<?>> topLevelFlagAmender) {
     LegacyTopLevelFlags.Builder builder = LegacyTopLevelFlags.builder();
 
     builder.setJsonSource(jsonConfigString);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyRewritingFlags.java
index ac9d662..9a38ff1a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyRewritingFlags.java
@@ -170,14 +170,16 @@
       this.factory = factory;
       this.reporter = reporter;
       this.origin = origin;
-      this.rewritePrefix = rewritePrefix;
-      this.emulateLibraryInterface = emulateLibraryInterface;
-      this.retargetCoreLibMember = retargetCoreLibMember;
-      this.backportCoreLibraryMember = backportCoreLibraryMember;
-      this.customConversions = customConversions;
-      this.dontRewriteInvocation = dontRewriteInvocation;
-      this.dontRetargetLibMember = dontRetargetLibMember;
-      this.wrapperConversions = wrapperConversions;
+      this.rewritePrefix = new HashMap<>(rewritePrefix);
+      this.emulateLibraryInterface = new IdentityHashMap<>(emulateLibraryInterface);
+      this.retargetCoreLibMember = new IdentityHashMap<>(retargetCoreLibMember);
+      this.backportCoreLibraryMember = new IdentityHashMap<>(backportCoreLibraryMember);
+      this.customConversions = new IdentityHashMap<>(customConversions);
+      this.dontRewriteInvocation = new ArrayList<>(dontRewriteInvocation);
+      this.dontRetargetLibMember = Sets.newIdentityHashSet();
+      this.dontRetargetLibMember.addAll(dontRetargetLibMember);
+      this.wrapperConversions = Sets.newIdentityHashSet();
+      this.wrapperConversions.addAll(wrapperConversions);
     }
 
     // Utility to set values. Currently assumes the key is fresh.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
index 8e0293b..59a3733 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification;
 
+import com.android.tools.r8.ir.desugar.desugaredlibrary.TopLevelFlagsBuilder;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -90,7 +91,7 @@
     return extraKeepRules;
   }
 
-  public static class Builder {
+  public static class Builder implements TopLevelFlagsBuilder<Builder> {
 
     private AndroidApiLevel requiredCompilationAPILevel;
     private String synthesizedLibraryClassesPackagePrefix =
@@ -122,6 +123,7 @@
       return this;
     }
 
+    @Override
     public Builder setSupportAllCallbacksFromLibrary(boolean supportAllCallbacksFromLibrary) {
       this.supportAllCallbacksFromLibrary = supportAllCallbacksFromLibrary;
       return this;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index 5dad42c..55ac78c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -89,6 +89,9 @@
 
   private void rewriteClasses() {
     for (DexClass clazz : appInfo.app().asDirect().libraryClasses()) {
+      if (clazz.toString().contains("MonthDay")) {
+        clazz.toString();
+      }
       registerType(clazz.type);
       registerDifferentType(clazz.type);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
index 8549488..6268125 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
@@ -56,7 +56,7 @@
     DexClass holder = appInfo.definitionFor(method.holder);
     DexEncodedMethod foundMethod = holder.lookupMethod(method);
     if (foundMethod == null) {
-      missingMethods.add(foundMethod.getReference());
+      missingMethods.add(method);
       return;
     }
     if (foundMethod.isStatic()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
index fac9895..0701952 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
@@ -28,6 +28,7 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
+import com.google.common.collect.Sets;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -38,6 +39,7 @@
 public class HumanToMachineSpecificationConverter {
 
   private AppView<?> appView;
+  private final Set<DexType> missingCustomConversions = Sets.newIdentityHashSet();
 
   public MachineDesugaredLibrarySpecification convert(
       HumanDesugaredLibrarySpecification humanSpec,
@@ -78,7 +80,10 @@
       throws IOException {
     DexApplication app = readApp(inputApp, options);
     appView = AppView.createForD8(AppInfo.createInitialAppInfo(app));
-    LibraryValidator.validate(app, humanSpec.getTopLevelFlags().getRequiredCompilationAPILevel());
+    LibraryValidator.validate(
+        app,
+        humanSpec.isLibraryCompilation(),
+        humanSpec.getTopLevelFlags().getRequiredCompilationAPILevel());
     MachineRewritingFlags machineRewritingFlags =
         convertRewritingFlags(
             humanSpec.getSynthesizedLibraryClassesPackagePrefix(), humanSpec.getRewritingFlags());
@@ -116,6 +121,8 @@
         .forEach(
             (type, conversionType) ->
                 convertCustomConversion(appInfo, builder, type, conversionType));
+    warnMissingReferences(
+        "Cannot register custom conversion due to missing type: ", missingCustomConversions);
     rewritingFlags.getDontRetarget().forEach(builder::addDontRetarget);
     rewritingFlags.getLegacyBackport().forEach(builder::putLegacyBackport);
     return builder.build();
@@ -127,6 +134,10 @@
       DexType type,
       DexType conversionType) {
     DexType rewrittenType = builder.getRewrittenType(type);
+    if (rewrittenType == null) {
+      missingCustomConversions.add(type);
+      return;
+    }
     DexProto fromProto = appInfo.dexItemFactory().createProto(rewrittenType, type);
     DexMethod fromMethod =
         appInfo
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
index d7bd243..3a2c990 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
@@ -61,8 +61,6 @@
             .parseMultiLevelConfiguration(inputSpecification);
     MultiAPILevelHumanDesugaredLibrarySpecification humanSpec =
         convertAllAPILevels(legacySpec, androidLib, options);
-    MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.deduplicateFlags(
-        humanSpec, options.reporter);
     MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.export(humanSpec, output);
   }
 
@@ -74,7 +72,6 @@
     Origin origin = legacySpec.getOrigin();
     AndroidApp androidApp = AndroidApp.builder().addLibraryFile(androidLib).build();
     DexApplication app = readApp(androidApp, options);
-    LibraryValidator.validate(app, legacySpec.getTopLevelFlags().getRequiredCompilationAPILevel());
     HumanTopLevelFlags humanTopLevelFlags = convertTopLevelFlags(legacySpec.getTopLevelFlags());
     Int2ObjectArrayMap<HumanRewritingFlags> commonFlags =
         convertRewritingFlagMap(legacySpec.getCommonFlags(), app, origin);
@@ -85,8 +82,12 @@
 
     legacyLibraryFlagHacks(libraryFlags, app, origin);
 
-    return new MultiAPILevelHumanDesugaredLibrarySpecification(
-        origin, humanTopLevelFlags, commonFlags, libraryFlags, programFlags);
+    MultiAPILevelHumanDesugaredLibrarySpecification humanSpec =
+        new MultiAPILevelHumanDesugaredLibrarySpecification(
+            origin, humanTopLevelFlags, commonFlags, libraryFlags, programFlags);
+    MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.deduplicateFlags(
+        humanSpec, options.reporter);
+    return humanSpec;
   }
 
   public HumanDesugaredLibrarySpecification convert(
@@ -112,7 +113,10 @@
       LegacyDesugaredLibrarySpecification legacySpec, AndroidApp inputApp, InternalOptions options)
       throws IOException {
     DexApplication app = readApp(inputApp, options);
-    LibraryValidator.validate(app, legacySpec.getTopLevelFlags().getRequiredCompilationAPILevel());
+    LibraryValidator.validate(
+        app,
+        legacySpec.isLibraryCompilation(),
+        legacySpec.getTopLevelFlags().getRequiredCompilationAPILevel());
     HumanTopLevelFlags humanTopLevelFlags = convertTopLevelFlags(legacySpec.getTopLevelFlags());
     // The origin is not maintained in non multi-level specifications.
     // It should not matter since the origin is used to report invalid specifications, and
@@ -136,6 +140,9 @@
       Int2ObjectArrayMap<HumanRewritingFlags> libraryFlags, DexApplication app, Origin origin) {
     int level = legacyHackLevel.getLevel();
     HumanRewritingFlags humanRewritingFlags = libraryFlags.get(level);
+    if (humanRewritingFlags == null) {
+      return;
+    }
     HumanRewritingFlags.Builder builder =
         humanRewritingFlags.newBuilder(app.options.reporter, origin);
     legacyLibraryFlagHacks(app.dexItemFactory(), builder);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java
index b415c354..ef19eb6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java
@@ -11,9 +11,16 @@
 
 public class LibraryValidator {
 
-  // Estimates if the library passed is at the expected minimum level, if it is not, raise
-  // a warning.
-  public static void validate(DexApplication app, AndroidApiLevel requiredCompilationAPILevel) {
+  /**
+   * In program compilation, The LibraryValidator estimates if the library passed is at the expected
+   * minimum level, if it is not, raises a warning.
+   */
+  public static void validate(
+      DexApplication app, boolean libraryCompilation, AndroidApiLevel requiredCompilationAPILevel) {
+    if (libraryCompilation) {
+      // In library compilation, the classes are passed as program classes and are always found.
+      return;
+    }
     DexType levelType;
     if (requiredCompilationAPILevel.isEqualTo(AndroidApiLevel.O)) {
       levelType = app.dexItemFactory.createType("Ljava/time/LocalTime;");
diff --git a/src/test/java/com/android/tools/r8/MarkersTest.java b/src/test/java/com/android/tools/r8/MarkersTest.java
index d883360..a38cf08 100644
--- a/src/test/java/com/android/tools/r8/MarkersTest.java
+++ b/src/test/java/com/android/tools/r8/MarkersTest.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.origin.Origin;
@@ -27,6 +28,7 @@
 import com.android.tools.r8.utils.FileUtils;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
+import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import java.nio.file.Path;
 import java.util.Collection;
@@ -36,7 +38,7 @@
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class MarkersTest extends TestBase {
+public class MarkersTest extends DesugaredLibraryTestBase {
 
   @Parameterized.Parameters(
       name = "{0}, compilationMode {1}, shrinkDesugaredLibrary {2}, noCfMarkerForDesugaredCode {3}")
@@ -84,18 +86,20 @@
     }
     L8.run(builder.build());
     Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
-    String version =
+    JsonObject jsonObject =
         new JsonParser()
             .parse(FileUtils.readTextFile(ToolHelper.getDesugarLibJsonForTesting(), Charsets.UTF_8))
-            .getAsJsonObject()
-            .get("version")
-            .getAsString();
+            .getAsJsonObject();
+    String identifier =
+        jsonObject.has("version")
+            ? "com.tools.android:desugar_jdk_libs:" + jsonObject.get("version").getAsString()
+            : jsonObject.get("identifier").getAsString();
 
     Matcher<Marker> l8Matcher =
         allOf(
             markerTool(Tool.L8),
             markerCompilationMode(compilationMode),
-            markerDesugaredLibraryIdentifier("com.tools.android:desugar_jdk_libs:" + version),
+            markerDesugaredLibraryIdentifier(identifier),
             markerHasChecksums(false));
     Matcher<Marker> r8Matcher =
         allOf(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index b5e5c03..6d3a0d3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -10,8 +10,8 @@
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecificationParser;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -60,16 +60,16 @@
             : "Caught j$.io.UncheckedIOException");
   }
 
-  LegacyDesugaredLibrarySpecification configurationAlternative3(
+  DesugaredLibrarySpecification configurationAlternative3(
       InternalOptions options, boolean libraryCompilation, TestParameters parameters) {
     // Parse the current configuration and amend the configuration for BufferedReader.lines. The
     // configuration is the same for both program and library.
-    return new LegacyDesugaredLibrarySpecificationParser(
-            options.dexItemFactory(),
-            options.reporter,
-            libraryCompilation,
-            parameters.getApiLevel().getLevel())
-        .parse(StringResource.fromFile(ToolHelper.getDesugarLibJsonForTestingAlternative3()));
+    return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
+        StringResource.fromFile(ToolHelper.getDesugarLibJsonForTestingAlternative3()),
+        options.dexItemFactory(),
+        options.reporter,
+        libraryCompilation,
+        parameters.getApiLevel().getLevel());
   }
 
   private void configurationForProgramCompilation(InternalOptions options) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
index e27dda9..4d87dbf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
@@ -8,8 +8,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecificationParser;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
@@ -67,13 +67,13 @@
     assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent();
   }
 
-  LegacyDesugaredLibrarySpecification chmOnlyConfiguration(
+  DesugaredLibrarySpecification chmOnlyConfiguration(
       InternalOptions options, boolean libraryCompilation, TestParameters parameters) {
-    return new LegacyDesugaredLibrarySpecificationParser(
-            options.dexItemFactory(),
-            options.reporter,
-            libraryCompilation,
-            parameters.getApiLevel().getLevel())
-        .parse(StringResource.fromFile(ToolHelper.getCHMOnlyDesugarLibJsonForTesting()));
+    return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
+        StringResource.fromFile(ToolHelper.getCHMOnlyDesugarLibJsonForTesting()),
+        options.dexItemFactory(),
+        options.reporter,
+        libraryCompilation,
+        parameters.getApiLevel().getLevel());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index f4786f7..c1066de 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -11,10 +11,10 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.fail;
 
+import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.L8Command;
-import com.android.tools.r8.L8TestBuilder;
+import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestDiagnosticMessages;
@@ -29,7 +29,6 @@
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Collections;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,20 +51,15 @@
   @Test
   public void testInvalidLibrary() throws Exception {
     Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
-    L8TestBuilder l8TestBuilder =
-        testForL8(parameters.getApiLevel())
-            .addProgramFiles(Collections.singleton(ToolHelper.getDesugarJDKLibs()))
+    D8TestCompileResult compile =
+        testForD8()
+            .addProgramClasses(GuineaPig.class)
             .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.L))
-            .setDesugarJDKLibsConfiguration(ToolHelper.DESUGAR_LIB_CONVERSIONS);
-    try {
-      l8TestBuilder.compile();
-      fail();
-    } catch (AssertionError ae) {
-      // Expected since the library is invalid.
-    }
-    TestDiagnosticMessages diagnosticMessages = l8TestBuilder.getDiagnosticMessages();
+            .enableCoreLibraryDesugaring(
+                LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
+            .compile();
+    TestDiagnosticMessages diagnosticMessages = compile.getDiagnosticMessages();
     diagnosticMessages.assertOnlyWarnings();
-    assertEquals(diagnosticMessages.getWarnings().size(), 1);
     assertTrue(
         diagnosticMessages
             .getWarnings()
@@ -166,4 +160,8 @@
     }
   }
 
+  static class GuineaPig {
+
+    public static void main(String[] args) {}
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index 612d36e..f50960b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -25,8 +25,7 @@
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecificationParser;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.tracereferences.TraceReferences;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
@@ -50,7 +49,7 @@
 
 public class DesugaredLibraryTestBase extends TestBase {
 
-  private static final boolean FORCE_JDK11_DESUGARED_LIB = false;
+  private static final boolean FORCE_JDK11_DESUGARED_LIB = true;
 
   @BeforeClass
   public static void setUpDesugaredLibrary() {
@@ -250,19 +249,18 @@
     return desugaredLib;
   }
 
-  protected LegacyDesugaredLibrarySpecification configurationWithSupportAllCallbacksFromLibrary(
+  protected DesugaredLibrarySpecification configurationWithSupportAllCallbacksFromLibrary(
       InternalOptions options,
       boolean libraryCompilation,
       TestParameters parameters,
       boolean supportAllCallbacksFromLibrary) {
-    return new LegacyDesugaredLibrarySpecificationParser(
-            options.dexItemFactory(),
-            options.reporter,
-            libraryCompilation,
-            parameters.getApiLevel().getLevel())
-        .parse(
-            StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()),
-            builder -> builder.setSupportAllCallbacksFromLibrary(supportAllCallbacksFromLibrary));
+    return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecificationforTesting(
+        StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()),
+        options.dexItemFactory(),
+        options.reporter,
+        libraryCompilation,
+        parameters.getApiLevel().getLevel(),
+        builder -> builder.setSupportAllCallbacksFromLibrary(supportAllCallbacksFromLibrary));
   }
 
   private Map<AndroidApiLevel, Path> desugaredLibraryClassFileCache = new HashMap<>();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
index 21dc2f9..581a153 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.GenerateLintFiles;
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
@@ -41,12 +40,13 @@
 import java.util.TreeSet;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class ExtractWrapperTypesTest extends TestBase {
+public class ExtractWrapperTypesTest extends DesugaredLibraryTestBase {
 
   // Filter on types that do not need to be considered for wrapping.
   private static boolean doesNotNeedWrapper(String type, Set<String> customConversions) {
@@ -273,6 +273,7 @@
 
   private CodeInspector getDesugaredApiJar() throws Exception {
     Path out = temp.newFolder().toPath();
+    Assume.assumeFalse("TODO(b/184026720): Support lint generation.", isJDK11DesugaredLibrary());
     GenerateLintFiles desugaredApi =
         new GenerateLintFiles(
             ToolHelper.getDesugarLibJsonForTesting().toString(),
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryConfigurationParsingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LegacyDesugaredLibraryConfigurationParsingTest.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryConfigurationParsingTest.java
rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LegacyDesugaredLibraryConfigurationParsingTest.java
index efc5ce8..7bf2046 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryConfigurationParsingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LegacyDesugaredLibraryConfigurationParsingTest.java
@@ -1,4 +1,4 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2022, 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 com.android.tools.r8.desugar.desugaredlibrary;
@@ -12,7 +12,6 @@
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
@@ -38,19 +37,20 @@
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class DesugaredLibraryConfigurationParsingTest extends TestBase {
+public class LegacyDesugaredLibraryConfigurationParsingTest extends DesugaredLibraryTestBase {
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
     return getTestParameters().withNoneRuntime().build();
   }
 
-  public DesugaredLibraryConfigurationParsingTest(TestParameters parameters) {
+  public LegacyDesugaredLibraryConfigurationParsingTest(TestParameters parameters) {
     parameters.assertNoneRuntime();
   }
 
@@ -87,6 +87,7 @@
   }
 
   private LegacyDesugaredLibrarySpecificationParser parser(DiagnosticsHandler handler) {
+    Assume.assumeFalse(isJDK11DesugaredLibrary());
     return new LegacyDesugaredLibrarySpecificationParser(
         factory, new Reporter(handler), libraryCompilation, minApi.getLevel());
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
index ed772cb..c21b7ea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
@@ -15,8 +15,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecificationParser;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -84,18 +84,17 @@
             Ordered.max(parameters.getApiLevel(), getRequiredCompilationAPILevel()));
   }
 
-  LegacyDesugaredLibrarySpecification desugaredLibrarySpecification(
+  DesugaredLibrarySpecification desugaredLibrarySpecification(
       InternalOptions options, boolean libraryCompilation, TestParameters parameters) {
-    return new LegacyDesugaredLibrarySpecificationParser(
-            options.dexItemFactory(),
-            options.reporter,
-            libraryCompilation,
-            parameters.getApiLevel().getLevel())
-        .parse(
-            StringResource.fromFile(
-                libraryDesugarJavaUtilObjects
-                    ? ToolHelper.getDesugarLibJsonForTestingAlternative3()
-                    : ToolHelper.getDesugarLibJsonForTesting()));
+    return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
+        StringResource.fromFile(
+            libraryDesugarJavaUtilObjects
+                ? ToolHelper.getDesugarLibJsonForTestingAlternative3()
+                : ToolHelper.getDesugarLibJsonForTesting()),
+        options.dexItemFactory(),
+        options.reporter,
+        libraryCompilation,
+        parameters.getApiLevel().getLevel());
   }
 
   private void configurationForProgramCompilation(InternalOptions options) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/specification/ConvertExportReadTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/specification/ConvertExportReadTest.java
index a972903..125b4ec 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/specification/ConvertExportReadTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/specification/ConvertExportReadTest.java
@@ -8,10 +8,10 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanTopLevelFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.MultiAPILevelHumanDesugaredLibrarySpecification;
@@ -31,7 +31,7 @@
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class ConvertExportReadTest extends TestBase {
+public class ConvertExportReadTest extends DesugaredLibraryTestBase {
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {