diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 4eca620..d6ca3f2 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -354,7 +354,7 @@
     internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
 
     // TODO(134732760): This is still work in progress.
-    internal.libraryConfiguration = libraryConfiguration;
+    internal.desugaredLibraryConfiguration = libraryConfiguration;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
     return internal;
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index a22cd4d..d20afac 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -137,7 +137,7 @@
     internal.enableInheritanceClassInDexDistributor = false;
 
     // TODO(134732760): This is still work in progress.
-    internal.libraryConfiguration = libraryConfiguration;
+    internal.desugaredLibraryConfiguration = libraryConfiguration;
 
     return internal;
   }
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 7050e40..8cd0868 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -678,7 +678,7 @@
       boolean encodeChecksum,
       BiPredicate<String, Long> dexClassChecksumFilter,
       StringConsumer desugaredLibraryKeepRuleConsumer,
-      com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration libraryConfiguration) {
+      DesugaredLibraryConfiguration libraryConfiguration) {
     super(
         inputApp,
         mode,
@@ -843,7 +843,7 @@
     internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
 
     // TODO(134732760): This is still work in progress.
-    internal.libraryConfiguration = libraryConfiguration;
+    internal.desugaredLibraryConfiguration = libraryConfiguration;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
     return internal;
diff --git a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
index 37c9e12..13500db 100644
--- a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
+++ b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
@@ -22,7 +22,7 @@
 
   static CodeToKeep createCodeToKeep(InternalOptions options, NamingLens namingLens) {
     if ((!namingLens.hasPrefixRewritingLogic()
-            && options.libraryConfiguration.getEmulateLibraryInterface().isEmpty())
+            && options.desugaredLibraryConfiguration.getEmulateLibraryInterface().isEmpty())
         || options.isDesugaredLibraryCompilation()) {
       return new NopCodeToKeep();
     }
@@ -51,7 +51,7 @@
       // Interface method desugaring should have created the types if emulatedLibraryInterfaces
       // are set.
       for (String rewrittenName :
-          options.libraryConfiguration.getEmulateLibraryInterface().values()) {
+          options.desugaredLibraryConfiguration.getEmulateLibraryInterface().values()) {
         DexString descriptor =
             options.itemFactory.lookupString(DescriptorUtils.javaTypeToDescriptor(rewrittenName));
         assert descriptor != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index b581486..95724de 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -80,7 +80,7 @@
     this.factory = appView.dexItemFactory();
     this.rewritableMethods = new RewritableMethods(appView);
     Map<String, String> backportCoreLibraryMembers =
-        appView.options().libraryConfiguration.getBackportCoreLibraryMember();
+        appView.options().desugaredLibraryConfiguration.getBackportCoreLibraryMember();
     for (String coreLibMember : backportCoreLibraryMembers.keySet()) {
       DexType extraCoreLibMemberType =
           factory.createType(DescriptorUtils.javaTypeToDescriptor(coreLibMember));
@@ -252,7 +252,7 @@
         initializeAndroidOMethodProviders(factory);
       }
 
-      if (options.libraryConfiguration.getRewritePrefix().containsKey("java.util.Optional")
+      if (options.desugaredLibraryConfiguration.getRewritePrefix().containsKey("java.util.Optional")
           || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
         // These are currently not implemented at any API level in Android.
         // They however require the Optional class to be present, either through
@@ -265,7 +265,7 @@
       initializeJava9MethodProviders(factory);
       initializeJava11MethodProviders(factory);
 
-      if (!options.libraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
+      if (!options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
         initializeRetargetCoreLibraryMembers(appView);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index e23772f..d81f3fe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -80,7 +80,8 @@
     boolean desugaredLibraryLookup =
         superClass != null
             && superClass.isLibraryClass()
-            && appView.options().libraryConfiguration.getEmulateLibraryInterface().size() > 0;
+            && appView.options().desugaredLibraryConfiguration.getEmulateLibraryInterface().size()
+                > 0;
 
     if (clazz.interfaces.isEmpty() && !desugaredLibraryLookup) {
       // Since superclass has already been processed and it has all missing methods
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index 437d78d..e812686 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -148,7 +148,7 @@
 
   private void initializeEmulatedInterfaceVariables() {
     Map<String, String> emulateLibraryInterface =
-        options.libraryConfiguration.getEmulateLibraryInterface();
+        options.desugaredLibraryConfiguration.getEmulateLibraryInterface();
     for (String interfaceName : emulateLibraryInterface.keySet()) {
       DexType interfaceType =
           factory.createType(DescriptorUtils.javaTypeToDescriptor(interfaceName));
@@ -168,7 +168,7 @@
     if (appView.options().isDesugaredLibraryCompilation()) {
       options.populateRetargetCoreLibMember(factory, retargetCoreMember);
     }
-    for (String dontRewrite : options.libraryConfiguration.getDontRewriteInvocation()) {
+    for (String dontRewrite : options.desugaredLibraryConfiguration.getDontRewriteInvocation()) {
       int index = dontRewrite.lastIndexOf('#');
       if (index <= 0 || index >= dontRewrite.length() - 1) {
         throw new CompilationError(
@@ -553,7 +553,8 @@
     if (emulatedInterfaces.containsKey(clazz.type)) {
       return true;
     }
-    return clazz.type.rewritingPrefixIn(options.libraryConfiguration.getRewritePrefix()) != null;
+    return clazz.type.rewritingPrefixIn(options.desugaredLibraryConfiguration.getRewritePrefix())
+        != null;
   }
 
   private boolean dontRewrite(DexMethod method) {
@@ -904,7 +905,7 @@
         DexType newType = inferEmulatedInterfaceName(clazz);
         if (newType != null
             && clazz.type.rewritingPrefixIn(
-                    appView.options().libraryConfiguration.getRewritePrefix())
+                    appView.options().desugaredLibraryConfiguration.getRewritePrefix())
                 == null) {
           // We do not rewrite if it is already going to be rewritten using the a rewritingPrefix.
           addRewritePrefix(clazz.type, newType.toString());
@@ -1089,7 +1090,8 @@
     // Companion/Emulated interface classes for desugared library won't be missing,
     // they are in the desugared library.
     if (prefixRewritingInterfaces.containsKey(missing.toString())
-        || missing.rewritingPrefixIn(appView.options().libraryConfiguration.getRewritePrefix())
+        || missing.rewritingPrefixIn(
+                appView.options().desugaredLibraryConfiguration.getRewritePrefix())
             != null) {
       return;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 5b58d86..d6f66c0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -527,7 +527,7 @@
             .converter
             .appView
             .options()
-            .libraryConfiguration
+            .desugaredLibraryConfiguration
             .getBackportCoreLibraryMember()
             .containsKey(implMethod.holder.toString());
         return false;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index d359630..9f17de1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -283,11 +283,11 @@
       if (appView.options().isDesugaredLibraryCompilation()) {
         Pair<String, String> rewriting =
             accessedFrom.rewritingPrefixIn(
-                appView.options().libraryConfiguration.getRewritePrefix());
+                appView.options().desugaredLibraryConfiguration.getRewritePrefix());
         if (rewriting == null) {
           rewriting =
               accessedFrom.rewritingPrefixIn(
-                  appView.options().libraryConfiguration.getEmulateLibraryInterface());
+                  appView.options().desugaredLibraryConfiguration.getEmulateLibraryInterface());
         }
         if (rewriting != null) {
           addRewritingPrefix(rewriting, lambdaClassType);
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index 914176e..ebf8d04 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -42,7 +42,7 @@
 
   public static NamingLens createPrefixRewritingNamingLens(
       InternalOptions options, Map<String, String> additionalRewritePrefix, NamingLens namingLens) {
-    if (options.libraryConfiguration.getRewritePrefix().isEmpty()
+    if (options.desugaredLibraryConfiguration.getRewritePrefix().isEmpty()
         && additionalRewritePrefix.isEmpty()) {
       return namingLens;
     }
@@ -60,7 +60,7 @@
             descriptorPrefixRewriting.put(
                 "L" + DescriptorUtils.getBinaryNameFromJavaType(from),
                 "L" + DescriptorUtils.getBinaryNameFromJavaType(to));
-    options.libraryConfiguration.getRewritePrefix().forEach(lambda);
+    options.desugaredLibraryConfiguration.getRewritePrefix().forEach(lambda);
     additionalRewritePrefix.forEach(lambda);
     // Run over all types and remap types with matching prefixes.
     // TODO(134732760): Use a more efficient data structure (prefix tree/trie).
diff --git a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
index 0b6531e..73609fe 100644
--- a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
@@ -37,7 +37,7 @@
 
   private void initializeEmulatedInterfaces() {
     for (String rewrittenName :
-        options.libraryConfiguration.getEmulateLibraryInterface().keySet()) {
+        options.desugaredLibraryConfiguration.getEmulateLibraryInterface().keySet()) {
       emulatedInterfaces.add(
           options.itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(rewrittenName)));
     }
@@ -45,7 +45,7 @@
 
   private void initializeBackports() {
     for (String backportName :
-        options.libraryConfiguration.getBackportCoreLibraryMember().keySet()) {
+        options.desugaredLibraryConfiguration.getBackportCoreLibraryMember().keySet()) {
       backports.add(
           options.itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(backportName)));
     }
@@ -58,7 +58,8 @@
     }
     List<DexProgramClass> toKeep = new ArrayList<>();
     for (DexProgramClass aClass : app.classes()) {
-      if (aClass.type.rewritingPrefixIn(options.libraryConfiguration.getRewritePrefix()) != null
+      if (aClass.type.rewritingPrefixIn(options.desugaredLibraryConfiguration.getRewritePrefix())
+              != null
           || emulatedInterfaces.contains(aClass.type)
           || interfaceImplementsEmulatedInterface(aClass, typeMap)) {
         toKeep.add(aClass);
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index f459ced..998e9c2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -308,7 +308,7 @@
   }
 
   public boolean isDesugaredLibraryCompilation() {
-    return libraryConfiguration.isLibraryCompilation();
+    return desugaredLibraryConfiguration.isLibraryCompilation();
   }
 
   public boolean shouldKeepStackMapTable() {
@@ -446,7 +446,8 @@
 
   public void populateRetargetCoreLibMember(
       DexItemFactory factory, Map<DexString, Map<DexType, DexType>> dest) {
-    Map<String, String> retargetCoreLibMember = libraryConfiguration.getRetargetCoreLibMember();
+    Map<String, String> retargetCoreLibMember =
+        desugaredLibraryConfiguration.getRetargetCoreLibMember();
     for (String inputString : retargetCoreLibMember.keySet()) {
       int index = inputString.lastIndexOf('#');
       if (index <= 0 || index >= inputString.length() - 1) {
@@ -607,7 +608,8 @@
 
   // If null, no desugaring of library is performed.
   // If non null it contains flags describing library desugaring.
-  public DesugaredLibraryConfiguration libraryConfiguration = DesugaredLibraryConfiguration.empty();
+  public DesugaredLibraryConfiguration desugaredLibraryConfiguration =
+      DesugaredLibraryConfiguration.empty();
 
   // If null, no keep rules are recorded.
   // If non null it records desugared library APIs used by the program.
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/JsonCompatibilityTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/JsonCompatibilityTest.java
index 7051374..7f78f21 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/JsonCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/JsonCompatibilityTest.java
@@ -40,7 +40,7 @@
   public void testCompatibilityProgram() {
     InternalOptions options1 = new InternalOptions(new DexItemFactory(), new Reporter());
     options1.minApiLevel = parameters.getApiLevel().getLevel();
-    options1.libraryConfiguration =
+    options1.desugaredLibraryConfiguration =
         DesugaredLibraryConfigurationForTesting.configureLibraryDesugaringForProgramCompilation(
             parameters.getApiLevel().getLevel());
 
@@ -48,7 +48,7 @@
     Reporter reporter = new Reporter();
     InternalOptions options2 = new InternalOptions(factory, reporter);
     options2.minApiLevel = parameters.getApiLevel().getLevel();
-    options2.libraryConfiguration =
+    options2.desugaredLibraryConfiguration =
         new DesugaredLibraryConfigurationParser(
                 factory, reporter, false, parameters.getApiLevel().getLevel())
             .parse(
@@ -56,14 +56,15 @@
                     Paths.get(
                         "src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs.json")));
 
-    assertConfigurationEquals(options1.libraryConfiguration, options2.libraryConfiguration);
+    assertConfigurationEquals(
+        options1.desugaredLibraryConfiguration, options2.desugaredLibraryConfiguration);
   }
 
   @Test
   public void testCompatibilityLibrary() {
     InternalOptions options1 = new InternalOptions(new DexItemFactory(), new Reporter());
     options1.minApiLevel = parameters.getApiLevel().getLevel();
-    options1.libraryConfiguration =
+    options1.desugaredLibraryConfiguration =
         DesugaredLibraryConfigurationForTesting.configureLibraryDesugaringForLibraryCompilation(
             parameters.getApiLevel().getLevel());
 
@@ -71,7 +72,7 @@
     Reporter reporter = new Reporter();
     InternalOptions options2 = new InternalOptions(factory, reporter);
     options2.minApiLevel = parameters.getApiLevel().getLevel();
-    options2.libraryConfiguration =
+    options2.desugaredLibraryConfiguration =
         new DesugaredLibraryConfigurationParser(
                 factory, reporter, true, parameters.getApiLevel().getLevel())
             .parse(
@@ -79,7 +80,8 @@
                     Paths.get(
                         "src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs.json")));
 
-    assertConfigurationEquals(options1.libraryConfiguration, options2.libraryConfiguration);
+    assertConfigurationEquals(
+        options1.desugaredLibraryConfiguration, options2.desugaredLibraryConfiguration);
   }
 
   private void assertConfigurationEquals(
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/LongestPrefixlTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/LongestPrefixlTest.java
index 15e9f41..37c6c12 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/LongestPrefixlTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/LongestPrefixlTest.java
@@ -45,7 +45,7 @@
           .addProgramFiles(inputJar)
           .addOptionsModification(
               options ->
-                  options.libraryConfiguration =
+                  options.desugaredLibraryConfiguration =
                       new DesugaredLibraryConfiguration(
                           false,
                           x,
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java b/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
index 8f90064..6c87416 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
@@ -77,7 +77,7 @@
             .setMinApi(parameters.getRuntime())
             .addOptionsModification(
                 options ->
-                    options.libraryConfiguration =
+                    options.desugaredLibraryConfiguration =
                         new DesugaredLibraryConfiguration(
                             false,
                             ImmutableMap.of(packageName + ".runtime", packageName + ".library"),
