diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d587efe..13f2404 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -331,6 +331,16 @@
       GraphLense graphLense = GraphLense.getIdentityLense();
 
       if (appInfo.hasLiveness()) {
+        if (options.proguardConfiguration.hasApplyMappingFile()) {
+          SeedMapper seedMapper =
+              SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
+          timing.begin("apply-mapping");
+          graphLense =
+              new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
+          application = application.asDirect().rewrittenWithLense(graphLense);
+          appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
+          timing.end();
+        }
         graphLense = new MemberRebindingAnalysis(appInfo.withLiveness(), graphLense).run();
         // Class merging requires inlining.
         if (options.enableClassMerging && options.enableInlining) {
@@ -339,20 +349,11 @@
               new VerticalClassMerger(application, appInfo.withLiveness(), graphLense, timing);
           graphLense = classMerger.run();
           timing.end();
-
+          application = application.asDirect().rewrittenWithLense(graphLense);
           appInfo = appInfo.withLiveness()
-              .prunedCopyFrom(application, classMerger.getRemovedClasses());
+              .prunedCopyFrom(application, classMerger.getRemovedClasses())
+              .rewrittenWithLense(application.asDirect(), graphLense);
         }
-        if (options.proguardConfiguration.hasApplyMappingFile()) {
-          SeedMapper seedMapper =
-              SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
-          timing.begin("apply-mapping");
-          graphLense =
-              new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
-          timing.end();
-        }
-        application = application.asDirect().rewrittenWithLense(graphLense);
-        appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
         // Collect switch maps and ordinals maps.
         appInfo = new SwitchMapCollector(appInfo.withLiveness(), options).run();
         appInfo = new EnumOrdinalMapCollector(appInfo.withLiveness(), options).run();
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
index c159b9d..f5d48fd 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
@@ -149,27 +149,25 @@
         }
       });
 
-      // We need to handle a lib class that extends another lib class where some members are not
-      // overridden, resulting in absence of definitions. References to those members need to be
-      // redirected via lense as well.
-      if (clazz.isLibraryClass()) {
-        classNaming.forAllFieldNaming(memberNaming -> {
-          if (!appliedMemberNaming.contains(memberNaming)) {
-            DexField pretendedOriginalField =
-                ((FieldSignature) memberNaming.getOriginalSignature())
-                    .toDexField(appInfo.dexItemFactory, from);
-            applyFieldMapping(pretendedOriginalField, memberNaming);
-          }
-        });
-        classNaming.forAllMethodNaming(memberNaming -> {
-          if (!appliedMemberNaming.contains(memberNaming)) {
-            DexMethod pretendedOriginalMethod =
-                ((MethodSignature) memberNaming.getOriginalSignature())
-                    .toDexMethod(appInfo.dexItemFactory, from);
-            applyMethodMapping(pretendedOriginalMethod, memberNaming);
-          }
-        });
-      }
+      // We need to handle a class that extends another class where some members are not overridden,
+      // resulting in absence of definitions. References to those members need to be redirected via
+      // the lense as well.
+      classNaming.forAllFieldNaming(memberNaming -> {
+        if (!appliedMemberNaming.contains(memberNaming)) {
+          DexField pretendedOriginalField =
+              ((FieldSignature) memberNaming.getOriginalSignature())
+                  .toDexField(appInfo.dexItemFactory, from);
+          applyFieldMapping(pretendedOriginalField, memberNaming);
+        }
+      });
+      classNaming.forAllMethodNaming(memberNaming -> {
+        if (!appliedMemberNaming.contains(memberNaming)) {
+          DexMethod pretendedOriginalMethod =
+              ((MethodSignature) memberNaming.getOriginalSignature())
+                  .toDexMethod(appInfo.dexItemFactory, from);
+          applyMethodMapping(pretendedOriginalMethod, memberNaming);
+        }
+      });
     }
 
     private void applyFieldMapping(DexField originalField, MemberNaming memberNaming) {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index da7a787..9efd5c8 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -116,7 +116,6 @@
   private void computeMethodRebinding(Set<DexMethod> methods,
       Function<DexMethod, DexEncodedMethod> lookupTarget) {
     for (DexMethod method : methods) {
-      method = lense.lookupMethod(method);
       // We can safely ignore array types, as the corresponding methods are defined in a library.
       if (!method.getHolder().isClassType()) {
         continue;
@@ -150,7 +149,7 @@
             target = bridgeMethod;
           }
         }
-        builder.map(method, validTargetFor(target.method, method));
+        builder.map(method, lense.lookupMethod(validTargetFor(target.method, method)));
       }
     }
   }
@@ -189,7 +188,6 @@
       BiFunction<DexClass, DexField, DexEncodedField> lookupTargetOnClass) {
     for (Map.Entry<DexField, Set<DexEncodedMethod>> entry : fields.entrySet()) {
       DexField field = entry.getKey();
-      field = lense.lookupField(field);
       DexEncodedField target = lookup.apply(field.getHolder(), field);
       // Rebind to the lowest library class or program class. Do not rebind accesses to fields that
       // are not visible from the access context.
@@ -197,7 +195,8 @@
       if (target != null && target.field != field
           && contexts.stream().allMatch(context ->
               isVisibleFromOriginalContext(context.method.getHolder(), target))) {
-        builder.map(field, validTargetFor(target.field, field, lookupTargetOnClass));
+        builder.map(field,
+            lense.lookupField(validTargetFor(target.field, field, lookupTargetOnClass)));
       }
     }
   }
