diff --git a/src/main/java/com/android/tools/r8/graph/GraphLense.java b/src/main/java/com/android/tools/r8/graph/GraphLense.java
index 5de4ae5..4feaf01 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLense.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLense.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.desugar.NestBasedAccessDesugaring.DexFieldWithAccess;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.IteratorUtils;
 import com.google.common.collect.BiMap;
@@ -441,6 +442,22 @@
 
   public abstract DexField lookupField(DexField field);
 
+  public DexMethod lookupStaticGetFieldForMethod(DexField field) {
+    return null;
+  }
+
+  public DexMethod lookupStaticPutFieldForMethod(DexField field) {
+    return null;
+  }
+
+  public DexMethod lookupInstanceGetFieldForMethod(DexField field) {
+    return null;
+  }
+
+  public DexMethod lookupInstancePutFieldForMethod(DexField field) {
+    return null;
+  }
+
   public DexReference lookupReference(DexReference reference) {
     if (reference.isDexType()) {
       return lookupType(reference.asDexType());
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 48092b0..34f2bba 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
@@ -49,6 +50,7 @@
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.InvokeMultiNewArray;
 import com.android.tools.r8.ir.code.InvokeNewArray;
+import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.MoveException;
 import com.android.tools.r8.ir.code.NewArrayEmpty;
 import com.android.tools.r8.ir.code.NewInstance;
@@ -260,7 +262,12 @@
           InstanceGet instanceGet = current.asInstanceGet();
           DexField field = instanceGet.getField();
           DexField actualField = graphLense.lookupField(field);
-          if (actualField != field) {
+          DexMethod replacementMethod =
+              graphLense.lookupInstanceGetFieldForMethod(actualField);
+          if (replacementMethod != null && method.method != replacementMethod) {
+            iterator.replaceCurrentInstruction(
+                new InvokeStatic(replacementMethod, current.outValue(), current.inValues()));
+          } else if (actualField != field) {
             InstanceGet newInstanceGet =
                 new InstanceGet(
                     makeOutValue(instanceGet, code, newSSAValues),
@@ -272,7 +279,12 @@
           InstancePut instancePut = current.asInstancePut();
           DexField field = instancePut.getField();
           DexField actualField = graphLense.lookupField(field);
-          if (actualField != field) {
+          DexMethod replacementMethod =
+              graphLense.lookupInstancePutFieldForMethod(actualField);
+          if (replacementMethod != null && method.method != replacementMethod) {
+            iterator.replaceCurrentInstruction(
+                new InvokeStatic(replacementMethod, current.outValue(), current.inValues()));
+          } else if (actualField != field) {
             InstancePut newInstancePut =
                 new InstancePut(actualField, instancePut.object(), instancePut.value());
             iterator.replaceCurrentInstruction(newInstancePut);
@@ -281,7 +293,12 @@
           StaticGet staticGet = current.asStaticGet();
           DexField field = staticGet.getField();
           DexField actualField = graphLense.lookupField(field);
-          if (actualField != field) {
+          DexMethod replacementMethod =
+              graphLense.lookupStaticGetFieldForMethod(actualField);
+          if (replacementMethod != null && method.method != replacementMethod) {
+            iterator.replaceCurrentInstruction(
+                new InvokeStatic(replacementMethod, current.outValue(), current.inValues()));
+          } else if (actualField != field) {
             StaticGet newStaticGet =
                 new StaticGet(makeOutValue(staticGet, code, newSSAValues), actualField);
             iterator.replaceCurrentInstruction(newStaticGet);
@@ -290,7 +307,12 @@
           StaticPut staticPut = current.asStaticPut();
           DexField field = staticPut.getField();
           DexField actualField = graphLense.lookupField(field);
-          if (actualField != field) {
+          DexMethod replacementMethod =
+              graphLense.lookupStaticPutFieldForMethod(actualField);
+          if (replacementMethod != null && method.method != replacementMethod) {
+            iterator.replaceCurrentInstruction(
+                new InvokeStatic(replacementMethod, current.outValue(), current.inValues()));
+          } else if (actualField != field) {
             StaticPut newStaticPut = new StaticPut(staticPut.inValue(), actualField);
             iterator.replaceCurrentInstruction(newStaticPut);
           }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index 1f91052..4b64470 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -152,7 +152,13 @@
 
   protected abstract void shouldRewriteCalls(DexMethod method, DexMethod bridge);
 
-  protected abstract void shouldRewriteFields(DexFieldWithAccess fieldKey, DexMethod bridge);
+  protected abstract void shouldRewriteStaticGetFields(DexField field, DexMethod bridge);
+
+  protected abstract void shouldRewriteStaticPutFields(DexField field, DexMethod bridge);
+
+  protected abstract void shouldRewriteInstanceGetFields(DexField field, DexMethod bridge);
+
+  protected abstract void shouldRewriteInstancePutFields(DexField field, DexMethod bridge);
 
   private RuntimeException abortCompilationDueToBridgeRequiredOnLibraryClass(
       DexClass compiledClass, DexClass libraryClass) {
@@ -263,7 +269,19 @@
               });
       // In program classes, any access to nest mate private member needs to be rewritten.
       if (currentClass.isProgramClass()) {
-        shouldRewriteFields(key, bridge.method);
+        if (isGet){
+          if (target.isStatic()){
+            shouldRewriteStaticGetFields(field, bridge.method);
+          } else {
+            shouldRewriteInstanceGetFields(field, bridge.method);
+          }
+        } else {
+          if (target.isStatic()){
+            shouldRewriteStaticPutFields(field, bridge.method);
+          } else {
+            shouldRewriteInstancePutFields(field, bridge.method);
+          }
+        }
       }
       return true;
     }
@@ -336,7 +354,7 @@
     private final DexEncodedField field;
     private final boolean isGet;
 
-    DexFieldWithAccess(DexEncodedField field, boolean isGet) {
+    public DexFieldWithAccess(DexEncodedField field, boolean isGet) {
       this.field = field;
       this.isGet = isGet;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringAnalysis.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringAnalysis.java
index f600180..6f44d56 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringAnalysis.java
@@ -1,6 +1,7 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.GraphLense;
 
@@ -28,8 +29,22 @@
   }
 
   @Override
-  protected void shouldRewriteFields(DexFieldWithAccess field, DexMethod bridge) {
-    // TODO(b/130529338): support fields in r8 (uncomment following line)
-    // builder.map(field, bridge);
+  protected void shouldRewriteStaticGetFields(DexField field, DexMethod bridge) {
+    builder.mapStaticGet(field,bridge);
+  }
+
+  @Override
+  protected void shouldRewriteStaticPutFields(DexField field, DexMethod bridge) {
+    builder.mapStaticPut(field,bridge);
+  }
+
+  @Override
+  protected void shouldRewriteInstanceGetFields(DexField field, DexMethod bridge) {
+    builder.mapInstanceGet(field,bridge);
+  }
+
+  @Override
+  protected void shouldRewriteInstancePutFields(DexField field, DexMethod bridge) {
+    builder.mapInstancePut(field,bridge);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringRewriter.java
index c6cdcd6..7cec930 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaringRewriter.java
@@ -1,8 +1,8 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
@@ -11,12 +11,17 @@
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.InvokeStatic;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.ListIterator;
+import java.util.Map;
 
 public class NestBasedAccessDesugaringRewriter extends NestBasedAccessDesugaring {
 
   private HashMap<DexMethod, DexMethod> methodToRewrite = new HashMap<>();
-  private HashMap<DexFieldWithAccess, DexMethod> fieldToRewrite = new HashMap<>();
+  private final Map<DexField, DexMethod> staticGetToMethodMap = new IdentityHashMap<>();
+  private final Map<DexField, DexMethod> staticPutToMethodMap = new IdentityHashMap<>();
+  private final Map<DexField, DexMethod> instanceGetToMethodMap = new IdentityHashMap<>();
+  private final Map<DexField, DexMethod> instancePutToMethodMap = new IdentityHashMap<>();
 
   public NestBasedAccessDesugaringRewriter(AppView<?> appView) {
     super(appView);
@@ -28,8 +33,36 @@
   }
 
   @Override
-  protected void shouldRewriteFields(DexFieldWithAccess fieldKey, DexMethod bridge) {
-    fieldToRewrite.put(fieldKey, bridge);
+  protected void shouldRewriteStaticGetFields(DexField field, DexMethod bridge) {
+    staticGetToMethodMap.put(field, bridge);
+  }
+
+  @Override
+  protected void shouldRewriteStaticPutFields(DexField field, DexMethod bridge) {
+    staticPutToMethodMap.put(field, bridge);
+  }
+
+  @Override
+  protected void shouldRewriteInstanceGetFields(DexField field, DexMethod bridge) {
+    instanceGetToMethodMap.put(field, bridge);
+  }
+
+  @Override
+  protected void shouldRewriteInstancePutFields(DexField field, DexMethod bridge) {
+    instancePutToMethodMap.put(field, bridge);
+  }
+
+  private void rewriteFieldAccess(
+      Instruction instruction,
+      InstructionListIterator instructions,
+      DexMethod method,
+      Map<DexField, DexMethod> fieldToMethodMap) {
+    DexField field = instruction.asFieldInstruction().getField();
+    DexMethod newTarget = fieldToMethodMap.get(field);
+    if (newTarget != null && method != newTarget) {
+      instructions.replaceCurrentInstruction(
+          new InvokeStatic(newTarget, instruction.outValue(), instruction.inValues()));
+    }
   }
 
   public void rewriteNestBasedAccesses(
@@ -51,19 +84,16 @@
             instructions.replaceCurrentInstruction(
                 new InvokeStatic(newTarget, invokeMethod.outValue(), invokeMethod.arguments()));
           }
-        } else if (instruction.isFieldInstruction()) {
-          DexEncodedField field =
-              appView.definitionFor(instruction.asFieldInstruction().getField());
-          if (field != null) {
-            DexMethod newTarget =
-                fieldToRewrite.get(
-                    new DexFieldWithAccess(
-                        field, instruction.isInstanceGet() || instruction.isStaticGet()));
-            if (newTarget != null && encodedMethod.method != newTarget) {
-              instructions.replaceCurrentInstruction(
-                  new InvokeStatic(newTarget, instruction.outValue(), instruction.inValues()));
-            }
-          }
+        } else if (instruction.isInstanceGet()) {
+          rewriteFieldAccess(
+              instruction, instructions, encodedMethod.method, instanceGetToMethodMap);
+        } else if (instruction.isInstancePut()) {
+          rewriteFieldAccess(
+              instruction, instructions, encodedMethod.method, instancePutToMethodMap);
+        } else if (instruction.isStaticGet()) {
+          rewriteFieldAccess(instruction, instructions, encodedMethod.method, staticGetToMethodMap);
+        } else if (instruction.isStaticPut()) {
+          rewriteFieldAccess(instruction, instructions, encodedMethod.method, staticPutToMethodMap);
         }
         // TODO(b/130529338): support initializers
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java b/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java
index 1835699..02e466f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.graph.GraphLense.NestedGraphLense;
 import com.android.tools.r8.ir.code.Invoke;
 import com.google.common.collect.ImmutableMap;
+import java.util.IdentityHashMap;
 import java.util.Map;
 
 public class NestedPrivateMethodLense extends NestedGraphLense {
@@ -15,25 +16,62 @@
   public static class Builder extends GraphLense.Builder {
 
     private final AppView<? extends AppInfo> appView;
+    private final Map<DexField, DexMethod> staticGetToMethodMap = new IdentityHashMap<>();
+    private final Map<DexField, DexMethod> staticPutToMethodMap = new IdentityHashMap<>();
+    private final Map<DexField, DexMethod> instanceGetToMethodMap = new IdentityHashMap<>();
+    private final Map<DexField, DexMethod> instancePutToMethodMap = new IdentityHashMap<>();
 
     protected Builder(AppView<? extends AppInfo> appView) {
       this.appView = appView;
     }
 
+    public void mapInstanceGet(DexField field, DexMethod method) {
+      instanceGetToMethodMap.put(field, method);
+    }
+
+    public void mapInstancePut(DexField field, DexMethod method) {
+      instancePutToMethodMap.put(field, method);
+    }
+
+    public void mapStaticGet(DexField field, DexMethod method) {
+      staticGetToMethodMap.put(field, method);
+    }
+
+    public void mapStaticPut(DexField field, DexMethod method) {
+      staticPutToMethodMap.put(field, method);
+    }
+
     public GraphLense build(GraphLense previousLense) {
       if (methodMap.isEmpty() && fieldMap.isEmpty()) {
         return previousLense;
       }
-      return new NestedPrivateMethodLense(appView, methodMap, fieldMap, previousLense);
+      return new NestedPrivateMethodLense(
+          appView,
+          methodMap,
+          fieldMap,
+          staticGetToMethodMap,
+          staticPutToMethodMap,
+          instanceGetToMethodMap,
+          instancePutToMethodMap,
+          previousLense);
     }
   }
 
   private final AppView<?> appView;
 
+  private final Map<DexField, DexMethod> staticGetToMethodMap;
+  private final Map<DexField, DexMethod> staticPutToMethodMap;
+  private final Map<DexField, DexMethod> instanceGetToMethodMap;
+  private final Map<DexField, DexMethod> instancePutToMethodMap;
+
   public NestedPrivateMethodLense(
       AppView<?> appView,
       Map<DexMethod, DexMethod> methodMap,
       Map<DexField, DexField> fieldMap,
+      Map<DexField, DexMethod> staticGetToMethodMap,
+      Map<DexField, DexMethod> staticPutToMethodMap,
+      Map<DexField, DexMethod> instanceGetToMethodMap,
+      Map<DexField, DexMethod> instancePutToMethodMap,
       GraphLense previousLense) {
     super(
         ImmutableMap.of(),
@@ -44,6 +82,30 @@
         previousLense,
         appView.dexItemFactory());
     this.appView = appView;
+    this.staticGetToMethodMap = staticGetToMethodMap;
+    this.staticPutToMethodMap = staticPutToMethodMap;
+    this.instanceGetToMethodMap = instanceGetToMethodMap;
+    this.instancePutToMethodMap = instancePutToMethodMap;
+  }
+
+  @Override
+  public DexMethod lookupStaticGetFieldForMethod(DexField field) {
+    return staticGetToMethodMap.get(field);
+  }
+
+  @Override
+  public DexMethod lookupStaticPutFieldForMethod(DexField field) {
+    return staticPutToMethodMap.get(field);
+  }
+
+  @Override
+  public DexMethod lookupInstanceGetFieldForMethod(DexField field) {
+    return instanceGetToMethodMap.get(field);
+  }
+
+  @Override
+  public DexMethod lookupInstancePutFieldForMethod(DexField field) {
+    return instancePutToMethodMap.get(field);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/desugar/NestAccessControl/NestAccessControlTest.java b/src/test/java/com/android/tools/r8/desugar/NestAccessControl/NestAccessControlTest.java
index b9a1f4f..d40cc47 100644
--- a/src/test/java/com/android/tools/r8/desugar/NestAccessControl/NestAccessControlTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/NestAccessControl/NestAccessControlTest.java
@@ -194,9 +194,9 @@
   public void testMethodsAccessR8() throws Exception {
     // TODO(b/130529390): As features are implemented, set success to true in each line.
     testR8("methods", true);
-    testR8("fields", parameters.isCfRuntime());
+    testR8("fields", true);
     testR8("constructors", parameters.isCfRuntime());
-    testR8("anonymous", parameters.isCfRuntime());
+    testR8("anonymous", true);
     testR8("all", parameters.isCfRuntime());
   }
 
