diff --git a/.gitignore b/.gitignore
index 78a056c..439dc2c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -156,6 +156,8 @@
 third_party/multidex
 third_party/multidex.tar.gz
 third_party/nest/*
+third_party/openjdk/custom_conversion
+third_party/openjdk/custom_conversion.tar.gz
 third_party/openjdk/desugar_jdk_libs
 third_party/openjdk/desugar_jdk_libs.tar.gz
 third_party/openjdk/desugar_jdk_libs_11
diff --git a/build.gradle b/build.gradle
index 6c28944..41d7c5c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,7 +4,6 @@
 
 
 
-import desugaredlibrary.CustomConversionAsmRewriterTask
 import net.ltgt.gradle.errorprone.CheckSeverity
 import org.gradle.internal.os.OperatingSystem
 import tasks.DownloadDependency
@@ -94,12 +93,6 @@
         }
         output.resourcesDir = 'build/classes/cfSegments'
     }
-    libraryDesugarConversions {
-        java {
-            srcDirs = ['src/library_desugar/java']
-        }
-        output.resourcesDir = 'build/classes/library_desugar_conversions'
-    }
     debugTestResources {
         java {
             srcDirs = ['src/test/debugTestResources']
@@ -337,6 +330,7 @@
                 "kotlin/kotlin-compiler-1.8.0",
                 "kotlinx-coroutines-1.3.6",
                 "multidex",
+                "openjdk/custom_conversion",
                 "openjdk/openjdk-rt-1.8",
                 "openjdk/desugar_jdk_libs",
                 "openjdk/desugar_jdk_libs_11",
@@ -972,19 +966,7 @@
     }
 }
 
-task rawBuildLibraryDesugarConversions(type: Zip, dependsOn: downloadDeps) {
-    from sourceSets.libraryDesugarConversions.output
-    include "java/**/*.class"
-    baseName 'library_desugar_conversions_raw'
-    destinationDir file('build/tmp/desugaredlibrary')
-}
-
-task buildLibraryDesugarConversions(type: CustomConversionAsmRewriterTask, dependsOn: rawBuildLibraryDesugarConversions) {
-    rawJar = file("build/tmp/desugaredlibrary/library_desugar_conversions_raw.zip")
-    outputDirectory = file("build/libs")
-}
-
-task testJarSources(type: Jar, dependsOn: [testClasses, buildLibraryDesugarConversions]) {
+task testJarSources(type: Jar, dependsOn: [testClasses]) {
     archiveFileName = "r8testsbase.jar"
     from sourceSets.test.output
     // We only want to include tests that use R8 when generating keep rules for applymapping.
@@ -1873,7 +1855,6 @@
 test { task ->
 
     dependsOn sourceSets.keepanno.output
-    dependsOn buildLibraryDesugarConversions
     // R8.jar is required for running bootstrap tests.
     dependsOn r8
 
diff --git a/buildSrc/src/main/java/desugaredlibrary/AsmRewriter.java b/buildSrc/src/main/java/desugaredlibrary/AsmRewriter.java
deleted file mode 100644
index cc1fcf2..0000000
--- a/buildSrc/src/main/java/desugaredlibrary/AsmRewriter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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 desugaredlibrary;
-
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-public abstract class AsmRewriter {
-
-  public static int ASM_VERSION = Opcodes.ASM9;
-
-  public static byte[] transformInvoke(byte[] bytes, MethodTransformer transformer) {
-    ClassReader reader = new ClassReader(bytes);
-    ClassWriter writer = new ClassWriter(reader, 0);
-    ClassVisitor subvisitor = new InvokeTransformer(writer, transformer);
-    reader.accept(subvisitor, 0);
-    return writer.toByteArray();
-  }
-
-  public static class InvokeTransformer extends ClassVisitor {
-
-    private final MethodTransformer transformer;
-
-    InvokeTransformer(ClassWriter writer, MethodTransformer transformer) {
-      super(ASM_VERSION, writer);
-      this.transformer = transformer;
-    }
-
-    @Override
-    public MethodVisitor visitMethod(
-        int access, String name, String descriptor, String signature, String[] exceptions) {
-      MethodVisitor sub = super.visitMethod(access, name, descriptor, signature, exceptions);
-      transformer.setMv(sub);
-      return transformer;
-    }
-  }
-
-  public static class MethodTransformer extends MethodVisitor {
-
-    protected MethodTransformer(int api) {
-      super(api);
-    }
-
-    public void setMv(MethodVisitor visitor) {
-      this.mv = visitor;
-    }
-  }
-}
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriterTask.java b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriterTask.java
deleted file mode 100644
index 1a09676..0000000
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriterTask.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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 desugaredlibrary;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import javax.inject.Inject;
-import org.gradle.api.DefaultTask;
-import org.gradle.api.file.RegularFileProperty;
-import org.gradle.api.tasks.InputFile;
-import org.gradle.api.tasks.OutputDirectory;
-import org.gradle.api.tasks.TaskAction;
-import org.gradle.workers.WorkAction;
-import org.gradle.workers.WorkParameters;
-import org.gradle.workers.WorkerExecutor;
-
-public class CustomConversionAsmRewriterTask extends DefaultTask {
-
-  private final WorkerExecutor workerExecutor;
-
-  private File rawJar;
-  private File outputDirectory;
-
-  @Inject
-  public CustomConversionAsmRewriterTask(WorkerExecutor workerExecutor) {
-    this.workerExecutor = workerExecutor;
-  }
-
-  @InputFile
-  public File getRawJar() {
-    return rawJar;
-  }
-
-  public void setRawJar(File rawJar) {
-    this.rawJar = rawJar;
-  }
-
-  @OutputDirectory
-  public File getOutputDirectory() {
-    return outputDirectory;
-  }
-
-  public void setOutputDirectory(File outputDirectory) {
-    this.outputDirectory = outputDirectory;
-  }
-
-  @TaskAction
-  void exec() {
-    workerExecutor
-        .noIsolation()
-        .submit(
-            Run.class,
-            parameters -> {
-              parameters.getRawJar().set(rawJar);
-              parameters.getOutputDirectory().set(outputDirectory);
-            });
-  }
-
-  public interface RunParameters extends WorkParameters {
-    RegularFileProperty getRawJar();
-
-    RegularFileProperty getOutputDirectory();
-  }
-
-  public abstract static class Run implements WorkAction<RunParameters> {
-
-    @Override
-    public void execute() {
-      try {
-        RunParameters parameters = getParameters();
-        CustomConversionAsmRewriter.generateJars(
-            parameters.getRawJar().getAsFile().get().toPath(),
-            parameters.getOutputDirectory().getAsFile().get().toPath());
-      } catch (IOException e) {
-        throw new UncheckedIOException(e);
-      }
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index ee9d68e..ce9a7fc 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -196,6 +196,7 @@
   private static final AndroidApiLevel DEFAULT_MIN_SDK = AndroidApiLevel.I;
 
   public static final String OPEN_JDK_DIR = THIRD_PARTY_DIR + "openjdk/";
+  public static final String CUSTOM_CONVERSION_DIR = OPEN_JDK_DIR + "custom_conversion/";
   public static final String JAVA_8_RUNTIME = OPEN_JDK_DIR + "openjdk-rt-1.8/rt.jar";
   public static final String JDK_11_TESTS_DIR = OPEN_JDK_DIR + "jdk-11-test/";
   public static final String JDK_11_TIME_TESTS_DIR = JDK_11_TESTS_DIR + "java/time/";
@@ -257,9 +258,7 @@
   public static final Path AAPT2 = Paths.get(THIRD_PARTY_DIR, "aapt2", "aapt2");
 
   public static Path getDesugarLibConversions(CustomConversionVersion legacy) {
-    return legacy == CustomConversionVersion.LEGACY
-        ? Paths.get(LIBS_DIR, "library_desugar_conversions_legacy.jar")
-        : Paths.get(LIBS_DIR, "library_desugar_conversions.jar");
+    return Paths.get(CUSTOM_CONVERSION_DIR, legacy.getFileName());
   }
 
   public static boolean isLocalDevelopment() {
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/CustomConversionAsmRewriteDescription.java
similarity index 87%
rename from buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/CustomConversionAsmRewriteDescription.java
index d1b949b..54fbe3c 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/CustomConversionAsmRewriteDescription.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, 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 desugaredlibrary;
+package com.android.tools.r8.desugar.desugaredlibrary.customconversion;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.HashMap;
@@ -16,8 +16,7 @@
 
   private static final Set<String> ENUM_WRAP_CONVERT_OWNER =
       ImmutableSet.of(
-          "j$/nio/file/attribute/PosixFilePermission",
-          "j$/util/stream/Collector$Characteristics");
+          "j$/nio/file/attribute/PosixFilePermission", "j$/util/stream/Collector$Characteristics");
   private static final Set<String> WRAP_CONVERT_OWNER =
       ImmutableSet.of(
           "j$/util/stream/DoubleStream",
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
similarity index 76%
rename from buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java
rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
index 95a5ecc..0712f45 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
@@ -1,17 +1,17 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, 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 desugaredlibrary;
+package com.android.tools.r8.desugar.desugaredlibrary.customconversion;
 
-import static desugaredlibrary.AsmRewriter.ASM_VERSION;
-import static desugaredlibrary.CustomConversionAsmRewriteDescription.CONVERT;
-import static desugaredlibrary.CustomConversionAsmRewriteDescription.WRAP_CONVERT;
-import static desugaredlibrary.CustomConversionAsmRewriter.CustomConversionVersion.LEGACY;
+import static com.android.tools.r8.TestBase.transformer;
+import static com.android.tools.r8.desugar.desugaredlibrary.customconversion.CustomConversionAsmRewriteDescription.CONVERT;
+import static com.android.tools.r8.desugar.desugaredlibrary.customconversion.CustomConversionAsmRewriteDescription.WRAP_CONVERT;
 import static org.objectweb.asm.Opcodes.INVOKESTATIC;
 
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.CustomConversionVersion;
+import com.android.tools.r8.transformers.MethodTransformer;
 import com.google.common.io.ByteStreams;
-import desugaredlibrary.AsmRewriter.MethodTransformer;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -27,33 +27,24 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
-public class CustomConversionAsmRewriter {
+public class GenerateCustomConversion {
 
-  public enum CustomConversionVersion {
-    LEGACY,
-    LATEST
+  public GenerateCustomConversion(CustomConversionVersion version) {
+    this.version = version;
   }
 
-  public CustomConversionAsmRewriter(CustomConversionVersion legacy) {
-    this.legacy = legacy;
-  }
-
-  private final CustomConversionVersion legacy;
+  private final CustomConversionVersion version;
   private final Map<String, String> wrapConvertOwnerMap =
       CustomConversionAsmRewriteDescription.getWrapConvertOwnerMap();
 
   public static void generateJars(Path jar, Path outputDirectory) throws IOException {
     for (CustomConversionVersion version : CustomConversionVersion.values()) {
-      new CustomConversionAsmRewriter(version).convert(jar, outputDirectory);
+      new GenerateCustomConversion(version).convert(jar, outputDirectory);
     }
   }
 
   private void convert(Path jar, Path outputDirectory) throws IOException {
-    String fileName = jar.getFileName().toString();
-    String newFileName =
-        fileName.substring(0, fileName.length() - "_raw.jar".length())
-            + (legacy == LEGACY ? "_legacy" : "")
-            + ".jar";
+    String newFileName = version.getFileName();
     Path convertedJar = outputDirectory.resolve(newFileName);
     internalConvert(jar, convertedJar);
   }
@@ -64,7 +55,7 @@
     try (ZipOutputStream out =
         new ZipOutputStream(
             new BufferedOutputStream(Files.newOutputStream(convertedJar, options)))) {
-      new CustomConversionAsmRewriter(legacy).convert(jar, out, legacy);
+      new GenerateCustomConversion(version).convert(jar, out, version);
     }
   }
 
@@ -88,7 +79,7 @@
     if (!entry.getName().endsWith(".class")) {
       return;
     }
-    if (legacy == LEGACY
+    if (legacy == CustomConversionVersion.LEGACY
         && (entry.getName().contains("java/nio/file")
             || entry.getName().contains("ApiFlips")
             || entry.getName().contains("java/adapter"))) {
@@ -118,13 +109,15 @@
   }
 
   private byte[] transformInvoke(byte[] bytes) {
-    return AsmRewriter.transformInvoke(bytes, new CustomConversionRewriter(ASM_VERSION));
+    return transformer(bytes, null)
+        .addMethodTransformer(new CustomConversionMethodTransformer())
+        .transform();
   }
 
-  class CustomConversionRewriter extends MethodTransformer {
+  class CustomConversionMethodTransformer extends MethodTransformer {
 
-    protected CustomConversionRewriter(int api) {
-      super(api);
+    protected CustomConversionMethodTransformer() {
+      super();
     }
 
     @Override
@@ -154,6 +147,5 @@
       String newOwner = wrapConvertOwnerMap.get(firstArg);
       super.visitMethodInsn(opcode, newOwner, CONVERT, descriptor, isInterface);
     }
-
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java
new file mode 100644
index 0000000..781a2be
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java
@@ -0,0 +1,110 @@
+// Copyright (c) 2023, 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.customconversion;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase.getAllFilesWithSuffixInDirectory;
+import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.JavaCompilerTool;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.CustomConversionVersion;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.stream.Stream;
+import java.util.zip.ZipFile;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class GenerateCustomConversionTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withCfRuntime(CfVm.JDK11).build();
+  }
+
+  public GenerateCustomConversionTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testCustomConversionIsUpToDate() throws IOException {
+    // Regenerate the files in a temp directory.
+    Path customConversionDir = temp.newFolder("custom_conversion").toPath();
+    Files.createDirectories(customConversionDir);
+    generateCustomConversions(customConversionDir);
+
+    for (CustomConversionVersion version : CustomConversionVersion.values()) {
+      // Assert the file is generated.
+      Path newFile = customConversionDir.resolve(version.getFileName());
+      assertTrue(Files.exists(newFile));
+
+      // Assert the file matches the one in third_party.
+      Path thirdPartyFile = ToolHelper.getDesugarLibConversions(version);
+      assertTrue(filesAreEqual(newFile, thirdPartyFile));
+    }
+  }
+
+  private static Path[] extractClasspath(Path customConversionDir) throws IOException {
+    try (Stream<Path> files = Files.walk(customConversionDir)) {
+      return files
+          .filter(
+              path ->
+                  path.toString().endsWith(JAVA_EXTENSION) && !path.toString().startsWith("java"))
+          .toArray(Path[]::new);
+    }
+  }
+
+  private static void generateCustomConversions(Path destinationDir) throws IOException {
+    // Get the sources for the custom conversions.
+    Path customConversionDir = Paths.get(ToolHelper.LIBRARY_DESUGAR_SOURCE_DIR, "java");
+    Path[] sourceFiles =
+        getAllFilesWithSuffixInDirectory(customConversionDir.resolve("java"), JAVA_EXTENSION);
+    assert sourceFiles.length > 0;
+    Path[] classpath = extractClasspath(customConversionDir);
+    assert classpath.length > 0;
+
+    // Generate the raw jar.
+    TemporaryFolder folder =
+        new TemporaryFolder(ToolHelper.isLinux() ? null : Paths.get("build", "tmp").toFile());
+    folder.create();
+    Path compiledClasspath = folder.newFolder().toPath().resolve("classpath.jar");
+    JavaCompilerTool.create(TestRuntime.getCheckedInJdk8(), folder)
+        .addSourceFiles(classpath)
+        .setOutputPath(compiledClasspath)
+        .compile();
+    Path output = folder.newFolder().toPath().resolve("raw.jar");
+    JavaCompilerTool.create(TestRuntime.getCheckedInJdk8(), folder)
+        .addClasspathFiles(compiledClasspath)
+        .addSourceFiles(sourceFiles)
+        .setOutputPath(output)
+        .compile();
+    try (ZipFile file = new ZipFile(output.toFile())) {
+      assert file.size() > 0;
+    }
+
+    // Asm rewrite the jar.
+    GenerateCustomConversion.generateJars(output, destinationDir);
+
+    folder.delete();
+  }
+
+  public static void main(String[] args) throws IOException {
+    generateCustomConversions(Paths.get(ToolHelper.CUSTOM_CONVERSION_DIR));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
index de43daf..3f70af1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
@@ -88,8 +88,18 @@
   }
 
   public enum CustomConversionVersion {
-    LEGACY,
-    LATEST
+    LEGACY("library_desugar_conversions_legacy.jar"),
+    LATEST("library_desugar_conversions.jar");
+
+    private final String fileName;
+
+    CustomConversionVersion(String fileName) {
+      this.fileName = fileName;
+    }
+
+    public String getFileName() {
+      return fileName;
+    }
   }
 
   private static Path tempLibraryJdk11UndesugarCache;
diff --git a/third_party/openjdk/custom_conversion.tar.gz.sha1 b/third_party/openjdk/custom_conversion.tar.gz.sha1
new file mode 100644
index 0000000..df8ff0c
--- /dev/null
+++ b/third_party/openjdk/custom_conversion.tar.gz.sha1
@@ -0,0 +1 @@
+61845e2ce51d01eb3f7a4177fdcd9f4a94f3bff0
\ No newline at end of file
diff --git a/tools/archive.py b/tools/archive.py
index 27c3b25..dda7ee2 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -3,11 +3,13 @@
 # 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 create_maven_release
-import gradle
 import jdk
 import optparse
 import os
+
+import create_maven_release
+import gradle
+
 try:
   import resource
 except ImportError:
@@ -16,10 +18,8 @@
 import shutil
 import subprocess
 import sys
-import toolhelper
 import utils
 import zipfile
-from build_r8lib import build_r8lib
 
 ARCHIVE_BUCKET = 'r8-releases'
 
@@ -165,7 +165,6 @@
           utils.R8LIB_NO_DEPS,
           utils.R8RETRACE,
           utils.R8RETRACE_NO_DEPS,
-          utils.LIBRARY_DESUGAR_CONVERSIONS,
           utils.KEEPANNO_ANNOTATIONS_TARGET,
           '-Pno_internal'
       ])
diff --git a/tools/utils.py b/tools/utils.py
index c737776..b7266ed 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -5,6 +5,7 @@
 # Different utility functions used accross scripts
 
 import hashlib
+import jdk
 import json
 import os
 import re
@@ -16,7 +17,6 @@
 import zipfile
 
 import defines
-import jdk
 from thread_utils import print_thread
 
 ANDROID_JAR_DIR = 'third_party/android_jar/lib-v{api}'
@@ -35,6 +35,8 @@
 BUILD_JAVA_MAIN_DIR = os.path.join(BUILD, 'classes', 'java', 'main')
 BUILD_TEST_DIR = os.path.join(BUILD, 'classes', 'test')
 LIBS = os.path.join(BUILD, 'libs')
+CUSTOM_CONVERSION_DIR = os.path.join(
+    THIRD_PARTY, 'openjdk', 'desugar_jdk_libs', 'custom_conversion')
 GENERATED_LICENSE_DIR = os.path.join(BUILD, 'generatedLicense')
 SRC_ROOT = os.path.join(REPO_ROOT, 'src', 'main', 'java')
 TEST_ROOT = os.path.join(REPO_ROOT, 'src', 'test', 'java')
@@ -47,7 +49,6 @@
 R8RETRACE = 'R8Retrace'
 R8RETRACE_NO_DEPS = 'R8RetraceNoDeps'
 R8_SRC = 'sourceJar'
-LIBRARY_DESUGAR_CONVERSIONS = 'buildLibraryDesugarConversions'
 R8_TESTS_TARGET = 'TestJar'
 R8_TESTS_DEPS_TARGET = 'RepackageTestDeps'
 R8LIB_TESTS_TARGET = 'configureTestForR8Lib'
@@ -70,8 +71,10 @@
 R8LIB_TESTS_DEPS_JAR = R8_TESTS_DEPS_JAR
 MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
 MAVEN_ZIP_LIB = os.path.join(LIBS, 'r8lib.zip')
-LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP = os.path.join(LIBS, 'library_desugar_conversions_legacy.jar')
-LIBRARY_DESUGAR_CONVERSIONS_ZIP = os.path.join(LIBS, 'library_desugar_conversions.jar')
+LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP = os.path.join(
+    CUSTOM_CONVERSION_DIR, 'library_desugar_conversions_legacy.jar')
+LIBRARY_DESUGAR_CONVERSIONS_ZIP = os.path.join(
+    CUSTOM_CONVERSION_DIR, 'library_desugar_conversions.jar')
 KEEPANNO_ANNOTATIONS_JAR = os.path.join(LIBS, 'keepanno-annotations.jar')
 
 DESUGAR_CONFIGURATION = os.path.join(
