diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 78d70a0..1e9566a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -17,8 +17,6 @@
 import java.util.Collection;
 
 // Computes the inlining constraint for a given instruction.
-//
-// TODO(christofferqa): This class is incomplete.
 public class InliningConstraints {
 
   private AppInfoWithLiveness appInfo;
@@ -40,6 +38,7 @@
   }
 
   public InliningConstraints(AppInfoWithLiveness appInfo, GraphLense graphLense) {
+    assert graphLense.isContextFreeForMethods();
     this.appInfo = appInfo;
     this.graphLense = graphLense;
   }
@@ -93,8 +92,9 @@
   }
 
   public Constraint forInstanceGet(DexField field, DexType invocationContext) {
+    DexField lookup = graphLense.lookupField(field);
     return forFieldInstruction(
-        field, appInfo.lookupInstanceTarget(field.clazz, field), invocationContext);
+        lookup, appInfo.lookupInstanceTarget(lookup.clazz, lookup), invocationContext);
   }
 
   public Constraint forInstanceOf(DexType type, DexType invocationContext) {
@@ -106,16 +106,19 @@
   }
 
   public Constraint forInstancePut(DexField field, DexType invocationContext) {
+    DexField lookup = graphLense.lookupField(field);
     return forFieldInstruction(
-        field, appInfo.lookupInstanceTarget(field.clazz, field), invocationContext);
+        lookup, appInfo.lookupInstanceTarget(lookup.clazz, lookup), invocationContext);
   }
 
   public Constraint forInvokeDirect(DexMethod method, DexType invocationContext) {
-    return forSingleTargetInvoke(method, appInfo.lookupDirectTarget(method), invocationContext);
+    DexMethod lookup = graphLense.lookupMethod(method);
+    return forSingleTargetInvoke(lookup, appInfo.lookupDirectTarget(lookup), invocationContext);
   }
 
   public Constraint forInvokeInterface(DexMethod method, DexType invocationContext) {
-    return forVirtualInvoke(method, appInfo.lookupInterfaceTargets(method), invocationContext);
+    DexMethod lookup = graphLense.lookupMethod(method);
+    return forVirtualInvoke(lookup, appInfo.lookupInterfaceTargets(lookup), invocationContext);
   }
 
   public Constraint forInvokeMultiNewArray(DexType type, DexType invocationContext) {
@@ -131,7 +134,8 @@
   }
 
   public Constraint forInvokeStatic(DexMethod method, DexType invocationContext) {
-    return forSingleTargetInvoke(method, appInfo.lookupStaticTarget(method), invocationContext);
+    DexMethod lookup = graphLense.lookupMethod(method);
+    return forSingleTargetInvoke(lookup, appInfo.lookupStaticTarget(lookup), invocationContext);
   }
 
   public Constraint forInvokeSuper(DexMethod method, DexType invocationContext) {
@@ -140,7 +144,8 @@
   }
 
   public Constraint forInvokeVirtual(DexMethod method, DexType invocationContext) {
-    return forVirtualInvoke(method, appInfo.lookupVirtualTargets(method), invocationContext);
+    DexMethod lookup = graphLense.lookupMethod(method);
+    return forVirtualInvoke(lookup, appInfo.lookupVirtualTargets(lookup), invocationContext);
   }
 
   public Constraint forJumpInstruction() {
@@ -190,13 +195,15 @@
   }
 
   public Constraint forStaticGet(DexField field, DexType invocationContext) {
+    DexField lookup = graphLense.lookupField(field);
     return forFieldInstruction(
-        field, appInfo.lookupStaticTarget(field.clazz, field), invocationContext);
+        lookup, appInfo.lookupStaticTarget(lookup.clazz, lookup), invocationContext);
   }
 
   public Constraint forStaticPut(DexField field, DexType invocationContext) {
+    DexField lookup = graphLense.lookupField(field);
     return forFieldInstruction(
-        field, appInfo.lookupStaticTarget(field.clazz, field), invocationContext);
+        lookup, appInfo.lookupStaticTarget(lookup.clazz, lookup), invocationContext);
   }
 
   public Constraint forStore() {
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 4a36895..f38626e 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1383,7 +1383,7 @@
     return true;
   }
 
-  private static class SingleTypeMapperGraphLense extends GraphLense {
+  private class SingleTypeMapperGraphLense extends GraphLense {
 
     private final DexType source;
     private final DexType target;
@@ -1401,17 +1401,18 @@
     @Override
     public GraphLenseLookupResult lookupMethod(
         DexMethod method, DexEncodedMethod context, Type type) {
-      throw new Unreachable();
+      return new GraphLenseLookupResult(
+          renamedMembersLense.methodMap.getOrDefault(method, method), type);
     }
 
     @Override
     public DexField lookupField(DexField field) {
-      throw new Unreachable();
+      return renamedMembersLense.fieldMap.getOrDefault(field, field);
     }
 
     @Override
     public boolean isContextFreeForMethods() {
-      throw new Unreachable();
+      return true;
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
index 4f614b4..fa10215 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
@@ -136,9 +136,8 @@
   public static class Builder {
     private final AppInfo appInfo;
 
-    private final ImmutableMap.Builder<DexField, DexField> fieldMapBuilder = ImmutableMap.builder();
-    private final ImmutableMap.Builder<DexMethod, DexMethod> methodMapBuilder =
-        ImmutableMap.builder();
+    protected final Map<DexField, DexField> fieldMap = new HashMap<>();
+    protected final Map<DexMethod, DexMethod> methodMap = new HashMap<>();
     private final ImmutableSet.Builder<DexMethod> mergedMethodsBuilder = ImmutableSet.builder();
     private final Map<DexType, Map<DexMethod, DexMethod>> contextualVirtualToDirectMethodMaps =
         new HashMap<>();
@@ -151,8 +150,6 @@
         GraphLense previousLense,
         Map<DexType, DexType> mergedClasses,
         DexItemFactory dexItemFactory) {
-      Map<DexField, DexField> fieldMap = fieldMapBuilder.build();
-      Map<DexMethod, DexMethod> methodMap = methodMapBuilder.build();
       if (fieldMap.isEmpty()
           && methodMap.isEmpty()
           && contextualVirtualToDirectMethodMaps.isEmpty()) {
@@ -205,11 +202,11 @@
     }
 
     public void map(DexField from, DexField to) {
-      fieldMapBuilder.put(from, to);
+      fieldMap.put(from, to);
     }
 
     public void map(DexMethod from, DexMethod to) {
-      methodMapBuilder.put(from, to);
+      methodMap.put(from, to);
     }
 
     public void mapVirtualMethodToDirectInType(DexMethod from, DexMethod to, DexType type) {
@@ -219,8 +216,8 @@
     }
 
     public void merge(VerticalClassMergerGraphLense.Builder builder) {
-      fieldMapBuilder.putAll(builder.fieldMapBuilder.build());
-      methodMapBuilder.putAll(builder.methodMapBuilder.build());
+      fieldMap.putAll(builder.fieldMap);
+      methodMap.putAll(builder.methodMap);
       mergedMethodsBuilder.addAll(builder.mergedMethodsBuilder.build());
       for (DexType context : builder.contextualVirtualToDirectMethodMaps.keySet()) {
         Map<DexMethod, DexMethod> current = contextualVirtualToDirectMethodMaps.get(context);
