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 c0b124b..5eb2f7f 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
@@ -67,7 +67,7 @@
     Map<ApiLevelRange, HumanRewritingFlags> libraryFlags =
         convertRewritingFlagMap(legacySpec.getLibraryFlags(), app, origin);
 
-    legacyLibraryFlagHacks(libraryFlags, app, origin);
+    legacyLibraryFlagHacks(humanTopLevelFlags.getIdentifier(), libraryFlags, app, origin);
     reportWarnings(app.options.reporter);
 
     MultiAPILevelHumanDesugaredLibrarySpecification humanSpec =
@@ -94,12 +94,12 @@
     Origin origin = Origin.unknown();
     HumanRewritingFlags humanRewritingFlags =
         convertRewritingFlags(legacySpec.getRewritingFlags(), app, origin);
-    if (app.options.getMinApiLevel().isLessThanOrEqualTo(LEGACY_HACK_LEVEL)
-        && legacySpec.isLibraryCompilation()) {
+    if (legacySpec.isLibraryCompilation()) {
       timing.begin("Legacy hacks");
       HumanRewritingFlags.Builder builder =
           humanRewritingFlags.newBuilder(app.options.reporter, origin);
-      legacyLibraryFlagHacks(app.dexItemFactory(), builder);
+      legacyLibraryFlagHacks(
+          app.dexItemFactory(), app.options.getMinApiLevel(), legacySpec.getIdentifier(), builder);
       humanRewritingFlags = builder.build();
       timing.end();
     }
@@ -128,7 +128,10 @@
   }
 
   private void legacyLibraryFlagHacks(
-      Map<ApiLevelRange, HumanRewritingFlags> libraryFlags, DexApplication app, Origin origin) {
+      String identifier,
+      Map<ApiLevelRange, HumanRewritingFlags> libraryFlags,
+      DexApplication app,
+      Origin origin) {
     ApiLevelRange range = new ApiLevelRange(LEGACY_HACK_LEVEL.getLevel());
     HumanRewritingFlags humanRewritingFlags = libraryFlags.get(range);
     if (humanRewritingFlags == null) {
@@ -137,39 +140,52 @@
     }
     HumanRewritingFlags.Builder builder =
         humanRewritingFlags.newBuilder(app.options.reporter, origin);
-    legacyLibraryFlagHacks(app.dexItemFactory(), builder);
+    legacyLibraryFlagHacks(app.dexItemFactory(), LEGACY_HACK_LEVEL, identifier, builder);
     libraryFlags.put(range, builder.build());
   }
 
   private void legacyLibraryFlagHacks(
-      DexItemFactory itemFactory, HumanRewritingFlags.Builder builder) {
+      DexItemFactory itemFactory,
+      AndroidApiLevel apiLevel,
+      String identifier,
+      HumanRewritingFlags.Builder builder) {
 
-    // TODO(b/177977763): This is only a workaround rewriting invokes of j.u.Arrays.deepEquals0
-    // to j.u.DesugarArrays.deepEquals0.
-    DexString name = itemFactory.createString("deepEquals0");
-    DexProto proto =
-        itemFactory.createProto(
-            itemFactory.booleanType, itemFactory.objectType, itemFactory.objectType);
-    DexMethod source =
-        itemFactory.createMethod(itemFactory.createType(itemFactory.arraysDescriptor), proto, name);
-    DexType target = itemFactory.createType("Ljava/util/DesugarArrays;");
-    builder.retargetMethod(source, target);
+    if (apiLevel.isLessThanOrEqualTo(LEGACY_HACK_LEVEL)) {
+      // TODO(b/177977763): This is only a workaround rewriting invokes of j.u.Arrays.deepEquals0
+      // to j.u.DesugarArrays.deepEquals0.
+      DexString name = itemFactory.createString("deepEquals0");
+      DexProto proto =
+          itemFactory.createProto(
+              itemFactory.booleanType, itemFactory.objectType, itemFactory.objectType);
+      DexMethod source =
+          itemFactory.createMethod(
+              itemFactory.createType(itemFactory.arraysDescriptor), proto, name);
+      DexType target = itemFactory.createType("Ljava/util/DesugarArrays;");
+      builder.retargetMethod(source, target);
 
-    builder.amendLibraryMethod(
-        source,
-        MethodAccessFlags.fromSharedAccessFlags(
-            Constants.ACC_PRIVATE | Constants.ACC_STATIC, false));
+      builder.amendLibraryMethod(
+          source,
+          MethodAccessFlags.fromSharedAccessFlags(
+              Constants.ACC_PRIVATE | Constants.ACC_STATIC, false));
 
-    // TODO(b/181629049): This is only a workaround rewriting invokes of
-    //  j.u.TimeZone.getTimeZone taking a java.time.ZoneId.
-    name = itemFactory.createString("getTimeZone");
-    proto =
-        itemFactory.createProto(
-            itemFactory.createType("Ljava/util/TimeZone;"),
-            itemFactory.createType("Ljava/time/ZoneId;"));
-    source = itemFactory.createMethod(itemFactory.createType("Ljava/util/TimeZone;"), proto, name);
-    target = itemFactory.createType("Ljava/util/DesugarTimeZone;");
-    builder.retargetMethod(source, target);
+      // TODO(b/181629049): This is only a workaround rewriting invokes of
+      //  j.u.TimeZone.getTimeZone taking a java.time.ZoneId.
+      name = itemFactory.createString("getTimeZone");
+      proto =
+          itemFactory.createProto(
+              itemFactory.createType("Ljava/util/TimeZone;"),
+              itemFactory.createType("Ljava/time/ZoneId;"));
+      source =
+          itemFactory.createMethod(itemFactory.createType("Ljava/util/TimeZone;"), proto, name);
+      target = itemFactory.createType("Ljava/util/DesugarTimeZone;");
+      builder.retargetMethod(source, target);
+    }
+    // Required by
+    // https://github.com/google/desugar_jdk_libs/commit/485071cd09a3691549d065ba9e323d07edccf085.
+    if (identifier.contains(":1.2")) {
+      builder.putRewriteDerivedPrefix(
+          "sun.misc.Desugar", "jdk.internal.misc.", "j$.sun.misc.Desugar");
+    }
   }
 
   private Map<ApiLevelRange, HumanRewritingFlags> convertRewritingFlagMap(
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index 6925eca..524abea 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-b5f9ea4c2328d7654db2966acd6582f4c1f80081
\ No newline at end of file
+ae103f657ce219b839706397baac799745d46049
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index 06dbf63..63d02c6 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -75,6 +75,9 @@
   'jdk11_nio': BASE_LIBRARY_NAME + '_jdk11_nio.zip'
 }
 
+DESUGAR_JDK_LIBS_HASH_FILE = os.path.join(
+    defines.THIRD_PARTY, 'openjdk', 'desugar_jdk_libs_11', 'desugar_jdk_libs_hash')
+
 
 def ParseOptions(argv):
   result = optparse.OptionParser()
@@ -131,11 +134,11 @@
     print('File available at: %s' %
         destination.replace('gs://', 'https://storage.googleapis.com/', 1))
 
-def CloneDesugaredLibrary(github_account, checkout_dir):
+def CloneDesugaredLibrary(github_account, checkout_dir, desugar_jdk_libs_hash):
   git_utils.GitClone(
     'https://github.com/'
         + github_account + '/' + GITHUB_REPRO, checkout_dir)
-  git_utils.GitCheckout('292df0eea1c2c1d6b8fe834c7b347ef0b0fdc11b', checkout_dir)
+  git_utils.GitCheckout(desugar_jdk_libs_hash, checkout_dir)
 
 def GetJavaEnv():
   java_env = dict(os.environ, JAVA_HOME = jdk.GetJdk11Home())
@@ -251,10 +254,13 @@
     raise Exception(path + ' does not exist or is not a directory')
 
 def BuildAndUpload(options, variant):
+  desugar_jdk_libs_hash = ''
+  with open(DESUGAR_JDK_LIBS_HASH_FILE, 'r') as input_hash:
+    desugar_jdk_libs_hash = input_hash.readline()
   if options.build_only:
     with utils.TempDir() as checkout_dir:
-      CloneDesugaredLibrary(options.github_account, checkout_dir)
-      (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, variant)
+      CloneDesugaredLibrary(options.github_account, checkout_dir, desugar_jdk_libs_hash)
+      (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, variant, desugar_jdk_libs_hash)
       shutil.copyfile(
         library_jar,
         os.path.join(options.build_only, os.path.basename(library_jar)))
@@ -267,7 +273,7 @@
   is_main = False
 
   with utils.TempDir() as checkout_dir:
-    CloneDesugaredLibrary(options.github_account, checkout_dir)
+    CloneDesugaredLibrary(options.github_account, checkout_dir, desugar_jdk_libs_hash)
     version = GetVersion(os.path.join(checkout_dir, VERSION_MAP[variant]))
 
     destination = archive.GetVersionDestination(
@@ -318,6 +324,7 @@
   utils.DownloadFromGoogleCloudStorage(utils.BAZEL_SHA_FILE)
   utils.DownloadFromGoogleCloudStorage(utils.JAVA8_SHA_FILE)
   utils.DownloadFromGoogleCloudStorage(utils.JAVA11_SHA_FILE)
+  utils.DownloadFromGoogleCloudStorage(utils.DESUGAR_JDK_LIBS_11_SHA_FILE)
 
   for v in options.variant:
     BuildAndUpload(options, v)
diff --git a/tools/desugar_jdk_libs_update.py b/tools/desugar_jdk_libs_update.py
new file mode 100755
index 0000000..2e751e9
--- /dev/null
+++ b/tools/desugar_jdk_libs_update.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+# 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.
+
+import argparse
+import os
+from os.path import join
+import shutil
+import subprocess
+import sys
+
+import utils
+
+def GetGitHash(checkout_dir):
+  return subprocess.check_output(
+      ['git', '-C', checkout_dir, 'rev-parse', 'HEAD']).decode('utf-8').strip()
+
+def run(args):
+  with utils.TempDir() as tmp_dir:
+    use_existing_checkout = args.desugar_jdk_libs_checkout != None
+    checkout_dir = (args.desugar_jdk_libs_checkout
+                    if use_existing_checkout
+                    else join(tmp_dir, 'desugar_jdk_libs'))
+    if (not use_existing_checkout):
+      subprocess.check_call(
+          ['git', 'clone', 'https://github.com/google/desugar_jdk_libs.git', checkout_dir])
+      if (args.desugar_jdk_libs_revision):
+        subprocess.check_call(
+            ['git', '-C', checkout_dir, 'checkout', args.desugar_jdk_libs_revision])
+    print("Building desugared library")
+    bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
+    with utils.ChangedWorkingDirectory(checkout_dir):
+      for target in [':desugar_jdk_libs_jdk11', '//jdk11/src:java_base_chm_only']:
+        subprocess.check_call([
+            bazel,
+            '--bazelrc=/dev/null',
+            'build',
+            '--spawn_strategy=local',
+            '--verbose_failures',
+            target])
+
+    openjdk_dir = join('third_party', 'openjdk')
+    openjdk_subdir = 'desugar_jdk_libs_11'
+    dest_dir = join(openjdk_dir, openjdk_subdir)
+    src_dir = join(checkout_dir, 'bazel-bin', 'jdk11', 'src')
+
+    metadata_files = ('LICENSE', 'README.google')
+    for f in metadata_files:
+      shutil.copyfile(join(dest_dir, f), join(tmp_dir, f))
+    shutil.rmtree(dest_dir)
+    os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz'))
+    os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz.sha1'))
+    os.mkdir(dest_dir)
+    for s in [
+        (join(src_dir, 'd8_java_base_selected_with_addon.jar'),
+          join(dest_dir, 'desugar_jdk_libs.jar')),
+        (join(src_dir, 'java_base_chm_only.jar'),
+          join(dest_dir, 'desugar_jdk_libs_chm_only.jar'))]:
+      shutil.copyfile(s[0], s[1])
+    for f in metadata_files:
+      shutil.copyfile(join(tmp_dir, f), join(dest_dir, f))
+    desugar_jdk_libs_hash = os.path.join(dest_dir, 'desugar_jdk_libs_hash')
+    with open(desugar_jdk_libs_hash, 'w') as desugar_jdk_libs_hash_writer:
+      desugar_jdk_libs_hash_writer.write(GetGitHash(checkout_dir))
+
+  print('Now run')
+  print('  (cd %s; upload_to_google_storage.py -a --bucket r8-deps %s)'
+      % (openjdk_dir, openjdk_subdir))
+
+
+
+def main():
+  args = parse_options()
+  run(args)
+
+def parse_options():
+  parser = argparse.ArgumentParser(
+    description='Script for updating third_party/openjdk/desugar_jdk_libs*')
+  parser.add_argument('--desugar-jdk-libs-checkout', '--desugar_jdk_libs_checkout',
+                      default=None,
+                      metavar=('<path>'),
+                      help='Use existing checkout of github.com/google/desugar_jdk_libs.')
+  parser.add_argument('--desugar-jdk-libs-revision', '--desugar_jdk_libs_revision',
+                      default=None,
+                      metavar=('<revision>'),
+                      help='Revision of github.com/google/desugar_jdk_libs to use.')
+  args = parser.parse_args()
+  return args
+
+
+if __name__ == '__main__':
+  sys.exit(main())
