diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
index ad230d1..c37ef50 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
@@ -13,8 +13,6 @@
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Binding;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Condition;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Edge;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.ExtractedAnnotation;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.ExtractedAnnotations;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.FieldAccess;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.ForApi;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Item;
@@ -37,7 +35,6 @@
 import com.android.tools.r8.keepanno.ast.KeepConstraints;
 import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.keepanno.ast.KeepEdge;
-import com.android.tools.r8.keepanno.ast.KeepEdgeException;
 import com.android.tools.r8.keepanno.ast.KeepEdgeMetaInfo;
 import com.android.tools.r8.keepanno.ast.KeepFieldAccessPattern;
 import com.android.tools.r8.keepanno.ast.KeepFieldNamePattern;
@@ -91,7 +88,7 @@
   public static int ASM_VERSION = ASM9;
 
   public static boolean isClassKeepAnnotation(String descriptor, boolean visible) {
-    return !visible && (isExtractedAnnotation(descriptor) || isEmbeddedAnnotation(descriptor));
+    return !visible && isEmbeddedAnnotation(descriptor);
   }
 
   public static boolean isFieldKeepAnnotation(String descriptor, boolean visible) {
@@ -102,10 +99,6 @@
     return !visible && isEmbeddedAnnotation(descriptor);
   }
 
-  private static boolean isExtractedAnnotation(String descriptor) {
-    return ExtractedAnnotations.DESCRIPTOR.equals(descriptor);
-  }
-
   private static boolean isEmbeddedAnnotation(String descriptor) {
     switch (descriptor) {
       case AnnotationConstants.Edge.DESCRIPTOR:
@@ -122,20 +115,14 @@
   }
 
   public static List<KeepDeclaration> readKeepEdges(byte[] classFileBytes) {
-    return internalReadKeepEdges(classFileBytes, true, false);
-  }
-
-  public static List<KeepDeclaration> readExtractedKeepEdges(byte[] classFileBytes) {
-    return internalReadKeepEdges(classFileBytes, false, true);
+    return internalReadKeepEdges(classFileBytes, true);
   }
 
   private static List<KeepDeclaration> internalReadKeepEdges(
-      byte[] classFileBytes, boolean readEmbedded, boolean readExtracted) {
+      byte[] classFileBytes, boolean readEmbedded) {
     ClassReader reader = new ClassReader(classFileBytes);
     List<KeepDeclaration> declarations = new ArrayList<>();
-    reader.accept(
-        new KeepEdgeClassVisitor(readEmbedded, readExtracted, declarations::add),
-        ClassReader.SKIP_CODE);
+    reader.accept(new KeepEdgeClassVisitor(readEmbedded, declarations::add), ClassReader.SKIP_CODE);
     return declarations;
   }
 
@@ -143,7 +130,6 @@
       String descriptor,
       boolean visible,
       boolean readEmbedded,
-      boolean readExtracted,
       String className,
       AnnotationParsingContext parsingContext,
       Consumer<KeepDeclaration> callback) {
@@ -151,7 +137,6 @@
         descriptor,
         visible,
         readEmbedded,
-        readExtracted,
         callback,
         parsingContext,
         className,
@@ -165,7 +150,6 @@
       String descriptor,
       boolean visible,
       boolean readEmbedded,
-      boolean readExtracted,
       String className,
       String fieldName,
       String fieldTypeDescriptor,
@@ -175,7 +159,6 @@
         descriptor,
         visible,
         readEmbedded,
-        readExtracted,
         callback::accept,
         parsingContext,
         className,
@@ -193,7 +176,6 @@
       String descriptor,
       boolean visible,
       boolean readEmbedded,
-      boolean readExtracted,
       String className,
       String methodName,
       String methodDescriptor,
@@ -203,7 +185,6 @@
         descriptor,
         visible,
         readEmbedded,
-        readExtracted,
         callback::accept,
         parsingContext,
         className,
@@ -305,16 +286,13 @@
 
   private static class KeepEdgeClassVisitor extends ClassVisitor {
     private final boolean readEmbedded;
-    private final boolean readExtracted;
     private final Parent<KeepDeclaration> parent;
     private String className;
     private ClassParsingContext parsingContext;
 
-    KeepEdgeClassVisitor(
-        boolean readEmbedded, boolean readExtracted, Parent<KeepDeclaration> parent) {
+    KeepEdgeClassVisitor(boolean readEmbedded, Parent<KeepDeclaration> parent) {
       super(ASM_VERSION);
       this.readEmbedded = readEmbedded;
-      this.readExtracted = readExtracted;
       this.parent = parent;
     }
 
@@ -345,7 +323,6 @@
           descriptor,
           visible,
           readEmbedded,
-          readExtracted,
           parent::accept,
           annotationParsingContext(descriptor),
           className,
@@ -356,7 +333,6 @@
         String descriptor,
         boolean visible,
         boolean readEmbedded,
-        boolean readExtracted,
         Consumer<KeepDeclaration> parent,
         AnnotationParsingContext parsingContext,
         String className,
@@ -366,9 +342,6 @@
         return null;
       }
 
-      if (readExtracted && isExtractedAnnotation(descriptor)) {
-        return new ExtractedAnnotationsVisitor(parsingContext, parent::accept);
-      }
       if (!readEmbedded || !isEmbeddedAnnotation(descriptor)) {
         return null;
       }
@@ -490,7 +463,6 @@
           descriptor,
           visible,
           true,
-          false,
           parent::accept,
           annotationParsingContext(descriptor),
           className,
@@ -503,7 +475,6 @@
         String descriptor,
         boolean visible,
         boolean readEmbedded,
-        boolean readExtracted,
         Consumer<KeepDeclaration> parent,
         AnnotationParsingContext parsingContext,
         String className,
@@ -627,7 +598,6 @@
           descriptor,
           visible,
           true,
-          false,
           parent::accept,
           annotationParsingContext(descriptor),
           className,
@@ -640,7 +610,6 @@
         String descriptor,
         boolean visible,
         boolean readEmbedded,
-        boolean readExtracted,
         Consumer<KeepEdge> parent,
         AnnotationParsingContext parsingContext,
         String className,
@@ -772,156 +741,6 @@
     }
   }
 
-  public static class ExtractedAnnotationsVisitor extends AnnotationVisitorBase {
-
-    private final Parent<KeepDeclaration> parent;
-    private List<KeepDeclaration> declarations = new ArrayList<>();
-
-    public ExtractedAnnotationsVisitor(
-        AnnotationParsingContext parsingContext, Parent<KeepDeclaration> parent) {
-      super(parsingContext);
-      this.parent = parent;
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(String name) {
-      if (name.equals(ExtractedAnnotations.value)) {
-        PropertyParsingContext parsingContext = getParsingContext().property(name);
-        return new AnnotationVisitorBase(parsingContext) {
-          @Override
-          public AnnotationVisitor visitAnnotation(String nullName, String descriptor) {
-            assert nullName == null;
-            if (descriptor.equals(ExtractedAnnotation.DESCRIPTOR)) {
-              return new ExtractedAnnotationVisitor(
-                  parsingContext.annotation(descriptor), declarations::add);
-            }
-            return super.visitAnnotation(nullName, descriptor);
-          }
-        };
-      }
-      return super.visitArray(name);
-    }
-
-    @Override
-    public void visitEnd() {
-      if (declarations.isEmpty()) {
-        throw new KeepEdgeException("Invalid extracted annotation set, expected non-empty.");
-      }
-      declarations.forEach(parent::accept);
-      super.visitEnd();
-    }
-  }
-
-  private static class ExtractedAnnotationVisitor extends AnnotationVisitorBase {
-
-    private final Parent<KeepDeclaration> parent;
-    private ContextDescriptor context = null;
-    private String version = null;
-    private KeepEdgeVisitor edgeVisitor = null;
-    private boolean isCheckRemoved = false;
-    private boolean isCheckOptimizedOut = false;
-
-    public ExtractedAnnotationVisitor(
-        AnnotationParsingContext parsingContext, Parent<KeepDeclaration> parent) {
-      super(parsingContext);
-      this.parent = parent;
-    }
-
-    private void ensureVersion(ParsingContext parsingContext) {
-      if (version == null) {
-        parsingContext.error("Property 'version' must be defined before any other property");
-      }
-    }
-
-    @Override
-    public void visit(String name, Object value) {
-      if (name.equals(ExtractedAnnotation.version) && value instanceof String) {
-        version = (String) value;
-        return;
-      }
-      ParsingContext parsingContext = getParsingContext().property(name);
-      ensureVersion(parsingContext);
-      if (name.equals(ExtractedAnnotation.context) && value instanceof String) {
-        context = ContextDescriptor.parse((String) value, parsingContext);
-        return;
-      }
-      if (name.equals(ExtractedAnnotation.checkRemoved) && value instanceof Boolean) {
-        isCheckRemoved = true;
-        return;
-      }
-      if (name.equals(ExtractedAnnotation.checkOptimizedOut) && value instanceof Boolean) {
-        isCheckOptimizedOut = true;
-        return;
-      }
-      super.visit(name, value);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(String name, String descriptor) {
-      if (name.equals(ExtractedAnnotation.edge) && descriptor.equals(Edge.DESCRIPTOR)) {
-        edgeVisitor =
-            new KeepEdgeVisitor(
-                getParsingContext().annotation(descriptor), edge -> {}, builder -> {});
-        return edgeVisitor;
-      }
-      return super.visitAnnotation(name, descriptor);
-    }
-
-    @Override
-    public void visitEnd() {
-      if (version == null) {
-        throw getParsingContext()
-            .error("Invalid extracted annotation, expected a version property.");
-      }
-      if (context == null) {
-        throw getParsingContext()
-            .error("Invalid extracted annotation, expected a context property.");
-      }
-      if (edgeVisitor != null) {
-        if (isCheckRemoved || isCheckOptimizedOut) {
-          throw getParsingContext()
-              .error("Invalid extracted annotation, cannot be both an edge and check.");
-        }
-        parent.accept(
-            edgeVisitor
-                .builder
-                .setMetaInfo(context.applyToMetadata(edgeVisitor.metaInfoBuilder).build())
-                .build());
-        return;
-      }
-      if (isCheckRemoved && isCheckOptimizedOut) {
-        throw getParsingContext()
-            .error(
-                "Invalid extracted annotation, cannot be both a removed and optimized-out check.");
-      }
-      if (!isCheckRemoved && !isCheckOptimizedOut) {
-        throw getParsingContext()
-            .error(
-                "Invalid extracted annotation, must specify either an edge, a removed check, or an"
-                    + " optimized-out check.");
-      }
-      KeepEdgeMetaInfo metaInfo = context.applyToMetadata(KeepEdgeMetaInfo.builder()).build();
-      KeepCheckKind kind = isCheckRemoved ? KeepCheckKind.REMOVED : KeepCheckKind.OPTIMIZED_OUT;
-      UserBindingsHelper bindingsHelper = new UserBindingsHelper();
-      KeepBindingReference contextBinding = context.defineBindingReference(bindingsHelper);
-      parent.accept(buildKeepCheckFromItem(metaInfo, kind, contextBinding, bindingsHelper));
-      super.visitEnd();
-    }
-
-    private static KeepCheck buildKeepCheckFromItem(
-        KeepEdgeMetaInfo metaInfo,
-        KeepCheckKind kind,
-        KeepBindingReference itemReference,
-        UserBindingsHelper bindingsHelper) {
-      return KeepCheck.builder()
-          .setMetaInfo(metaInfo)
-          .setKind(kind)
-          .setBindings(bindingsHelper.build())
-          .setItemReference(itemReference)
-          .build();
-    }
-  }
-
   private static class KeepEdgeVisitor extends AnnotationVisitorBase {
 
     private final ParsingContext parsingContext;
@@ -1676,9 +1495,20 @@
     @Override
     public void visitEnd() {
       super.visitEnd();
-      parent.accept(
-          ExtractedAnnotationVisitor.buildKeepCheckFromItem(
-              metaInfoBuilder.build(), kind, context, bindingsHelper));
+      parent.accept(buildKeepCheckFromItem(metaInfoBuilder.build(), kind, context, bindingsHelper));
+    }
+
+    private static KeepCheck buildKeepCheckFromItem(
+        KeepEdgeMetaInfo metaInfo,
+        KeepCheckKind kind,
+        KeepBindingReference itemReference,
+        UserBindingsHelper bindingsHelper) {
+      return KeepCheck.builder()
+          .setMetaInfo(metaInfo)
+          .setKind(kind)
+          .setBindings(bindingsHelper.build())
+          .setItemReference(itemReference)
+          .build();
     }
   }
 
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
deleted file mode 100644
index 2645b35..0000000
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
+++ /dev/null
@@ -1,603 +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 com.android.tools.r8.keepanno.asm;
-
-import com.android.tools.r8.keepanno.ast.AccessVisibility;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.AnnotationPattern;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Binding;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.ClassNamePattern;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Condition;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Constraints;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Edge;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.ExtractedAnnotation;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.ExtractedAnnotations;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.FieldAccess;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.InstanceOfPattern;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Item;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Kind;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.MemberAccess;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.MethodAccess;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.StringPattern;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Target;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.TypePattern;
-import com.android.tools.r8.keepanno.ast.KeepAnnotationPattern;
-import com.android.tools.r8.keepanno.ast.KeepBindingReference;
-import com.android.tools.r8.keepanno.ast.KeepBindings;
-import com.android.tools.r8.keepanno.ast.KeepClassBindingReference;
-import com.android.tools.r8.keepanno.ast.KeepClassItemPattern;
-import com.android.tools.r8.keepanno.ast.KeepConsequences;
-import com.android.tools.r8.keepanno.ast.KeepConstraint;
-import com.android.tools.r8.keepanno.ast.KeepConstraints;
-import com.android.tools.r8.keepanno.ast.KeepDeclaration;
-import com.android.tools.r8.keepanno.ast.KeepEdge;
-import com.android.tools.r8.keepanno.ast.KeepEdgeException;
-import com.android.tools.r8.keepanno.ast.KeepEdgeMetaInfo;
-import com.android.tools.r8.keepanno.ast.KeepFieldAccessPattern;
-import com.android.tools.r8.keepanno.ast.KeepFieldPattern;
-import com.android.tools.r8.keepanno.ast.KeepInstanceOfPattern;
-import com.android.tools.r8.keepanno.ast.KeepItemPattern;
-import com.android.tools.r8.keepanno.ast.KeepMemberAccessPattern;
-import com.android.tools.r8.keepanno.ast.KeepMemberItemPattern;
-import com.android.tools.r8.keepanno.ast.KeepMemberPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodAccessPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodParametersPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodReturnTypePattern;
-import com.android.tools.r8.keepanno.ast.KeepPackagePattern;
-import com.android.tools.r8.keepanno.ast.KeepPreconditions;
-import com.android.tools.r8.keepanno.ast.KeepQualifiedClassNamePattern;
-import com.android.tools.r8.keepanno.ast.KeepStringPattern;
-import com.android.tools.r8.keepanno.ast.KeepTarget;
-import com.android.tools.r8.keepanno.ast.KeepTypePattern;
-import com.android.tools.r8.keepanno.ast.ModifierPattern;
-import com.android.tools.r8.keepanno.ast.OptionalPattern;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-public class KeepEdgeWriter implements Opcodes {
-
-  /** Annotation visitor interface to allow usage from tests without type conflicts in r8lib. */
-  public interface AnnotationVisitorInterface {
-    int version();
-
-    void visit(String name, Object value);
-
-    void visitEnum(String name, String descriptor, String value);
-
-    AnnotationVisitorInterface visitAnnotation(String name, String descriptor);
-
-    AnnotationVisitorInterface visitArray(String name);
-
-    void visitEnd();
-  }
-
-  private static AnnotationVisitor wrap(AnnotationVisitorInterface visitor) {
-    if (visitor == null) {
-      return null;
-    }
-    return new AnnotationVisitor(visitor.version()) {
-
-      @Override
-      public void visit(String name, Object value) {
-        visitor.visit(name, value);
-      }
-
-      @Override
-      public void visitEnum(String name, String descriptor, String value) {
-        visitor.visitEnum(name, descriptor, value);
-      }
-
-      @Override
-      public AnnotationVisitor visitAnnotation(String name, String descriptor) {
-        AnnotationVisitorInterface v = visitor.visitAnnotation(name, descriptor);
-        return v == visitor ? this : wrap(v);
-      }
-
-      @Override
-      public AnnotationVisitor visitArray(String name) {
-        AnnotationVisitorInterface v = visitor.visitArray(name);
-        return v == visitor ? this : wrap(v);
-      }
-
-      @Override
-      public void visitEnd() {
-        visitor.visitEnd();
-      }
-    };
-  }
-
-  // Helper to ensure that any call creating a new annotation visitor is statically scoped with its
-  // call to visit end.
-  private static void withNewVisitor(AnnotationVisitor visitor, Consumer<AnnotationVisitor> fn) {
-    fn.accept(visitor);
-    visitor.visitEnd();
-  }
-
-  public static void writeExtractedEdges(
-      List<KeepDeclaration> declarations,
-      BiFunction<String, Boolean, AnnotationVisitorInterface> getVisitor) {
-    if (declarations.isEmpty()) {
-      return;
-    }
-    withNewVisitor(
-        wrap(getVisitor.apply(ExtractedAnnotations.DESCRIPTOR, false)),
-        containerVisitor ->
-            withNewVisitor(
-                containerVisitor.visitArray(ExtractedAnnotations.value),
-                arrayVisitor ->
-                    declarations.forEach(
-                        decl ->
-                            withNewVisitor(
-                                arrayVisitor.visitAnnotation(null, ExtractedAnnotation.DESCRIPTOR),
-                                extractVisitor -> writeExtractedEdge(extractVisitor, decl)))));
-  }
-
-  private static void writeExtractedEdge(AnnotationVisitor visitor, KeepDeclaration decl) {
-    KeepEdgeMetaInfo metaInfo = decl.getMetaInfo();
-    visitor.visit(ExtractedAnnotation.version, metaInfo.getVersion().toVersionString());
-    visitor.visit(ExtractedAnnotation.context, metaInfo.getContextDescriptorString());
-    decl.match(
-        edge -> {
-          withNewVisitor(
-              visitor.visitAnnotation(ExtractedAnnotation.edge, Edge.DESCRIPTOR),
-              v -> new KeepEdgeWriter().writeEdge(edge, v));
-        },
-        check -> {
-          switch (check.getKind()) {
-            case REMOVED:
-              visitor.visit(ExtractedAnnotation.checkRemoved, true);
-              break;
-            case OPTIMIZED_OUT:
-              visitor.visit(ExtractedAnnotation.checkOptimizedOut, true);
-              break;
-            default:
-              throw new KeepEdgeException("Unexpected keep check kind: " + check.getKind());
-          }
-        });
-  }
-
-  private void writeEdge(KeepEdge edge, AnnotationVisitor visitor) {
-    writeMetaInfo(visitor, edge.getMetaInfo());
-    writeBindings(visitor, edge.getBindings());
-    writePreconditions(visitor, edge.getPreconditions());
-    writeConsequences(visitor, edge.getConsequences());
-  }
-
-  private void writeMetaInfo(AnnotationVisitor visitor, KeepEdgeMetaInfo metaInfo) {
-    // The edge version and context is written in the extraction header.
-    if (metaInfo.hasDescription()) {
-      visitor.visit(Edge.description, metaInfo.getDescriptionString());
-    }
-  }
-
-  private void writeBindings(AnnotationVisitor visitor, KeepBindings bindings) {
-    if (bindings.isEmpty()) {
-      return;
-    }
-    withNewVisitor(
-        visitor.visitArray(Edge.bindings),
-        arrayVisitor -> {
-          bindings.forEach(
-              (symbol, item) -> {
-                withNewVisitor(
-                    arrayVisitor.visitAnnotation(null, Binding.DESCRIPTOR),
-                    bindingVisitor -> {
-                      bindingVisitor.visit(Binding.bindingName, symbol.toString());
-                      // The item is written directly into the binding annotation.
-                      writeItem(bindingVisitor, item);
-                    });
-              });
-        });
-  }
-
-  private void writeStringPattern(
-      KeepStringPattern stringPattern, String propertyName, AnnotationVisitor visitor) {
-    withNewVisitor(
-        visitor.visitAnnotation(propertyName, AnnotationConstants.StringPattern.DESCRIPTOR),
-        v -> {
-          if (stringPattern.isAny()) {
-            // The emtpy pattern matches any string.
-            return;
-          }
-          if (stringPattern.isExact()) {
-            v.visit(StringPattern.exact, stringPattern.asExactString());
-            return;
-          }
-          if (stringPattern.hasPrefix()) {
-            v.visit(StringPattern.startsWith, stringPattern.getPrefixString());
-          }
-          if (stringPattern.hasSuffix()) {
-            v.visit(StringPattern.endsWith, stringPattern.getSuffixString());
-          }
-        });
-  }
-
-  private void writePreconditions(AnnotationVisitor visitor, KeepPreconditions preconditions) {
-    if (preconditions.isAlways()) {
-      return;
-    }
-    String ignoredArrayValueName = null;
-    withNewVisitor(
-        visitor.visitArray(Edge.preconditions),
-        arrayVisitor ->
-            preconditions.forEach(
-                condition ->
-                    withNewVisitor(
-                        arrayVisitor.visitAnnotation(ignoredArrayValueName, Condition.DESCRIPTOR),
-                        conditionVisitor ->
-                            writeItemReference(conditionVisitor, condition.getItem()))));
-  }
-
-  private void writeConsequences(AnnotationVisitor visitor, KeepConsequences consequences) {
-    assert !consequences.isEmpty();
-    String ignoredArrayValueName = null;
-    withNewVisitor(
-        visitor.visitArray(Edge.consequences),
-        arrayVisitor ->
-            consequences.forEachTarget(
-                target ->
-                    withNewVisitor(
-                        arrayVisitor.visitAnnotation(ignoredArrayValueName, Target.DESCRIPTOR),
-                        targetVisitor -> writeTarget(target, targetVisitor))));
-  }
-
-  private void writeTarget(KeepTarget target, AnnotationVisitor visitor) {
-    writeConstraints(visitor, target.getConstraints(), target.getItem());
-    writeItemReference(visitor, target.getItem());
-  }
-
-  private void writeConstraints(
-      AnnotationVisitor visitor, KeepConstraints constraints, KeepBindingReference item) {
-    Set<KeepConstraint> typedConstraints;
-    if (item.isClassType()) {
-      typedConstraints = constraints.getClassConstraints();
-    } else {
-      typedConstraints = constraints.getMemberConstraints();
-    }
-
-    List<String> constraintEnumValues = new ArrayList<>();
-    List<KeepAnnotationPattern> annotationConstraints = new ArrayList<>();
-    for (KeepConstraint constraint : typedConstraints) {
-      String value = constraint.getEnumValue();
-      if (value != null) {
-        constraintEnumValues.add(value);
-        continue;
-      }
-      KeepAnnotationPattern annotationPattern = constraint.asAnnotationPattern();
-      if (annotationPattern != null) {
-        annotationConstraints.add(annotationPattern);
-        continue;
-      }
-      throw new Unimplemented("Missing: " + constraint.getClass().toString());
-    }
-    // The default constraints is *not* the empty set, so always write it as defined.
-    constraintEnumValues.sort(String::compareTo);
-    withNewVisitor(
-        visitor.visitArray(Target.constraints),
-        arrayVisitor ->
-            constraintEnumValues.forEach(
-                c -> arrayVisitor.visitEnum(null, Constraints.DESCRIPTOR, c)));
-    if (!annotationConstraints.isEmpty()) {
-      if (annotationConstraints.size() > 1) {
-        annotationConstraints.sort(
-            Comparator.comparing((KeepAnnotationPattern p) -> p.getNamePattern().toString())
-                .thenComparingInt(p -> p.includesClassRetention() ? 1 : 0)
-                .thenComparingInt(p -> p.includesRuntimeRetention() ? 1 : 0));
-      }
-      withNewVisitor(
-          visitor.visitArray(Target.constrainAnnotations),
-          arrayVisitor ->
-              annotationConstraints.forEach(
-                  annotation -> {
-                    withNewVisitor(
-                        arrayVisitor.visitAnnotation(null, AnnotationPattern.DESCRIPTOR),
-                        annoVisitor -> {
-                          writeClassNamePattern(
-                              annotation.getNamePattern(),
-                              AnnotationPattern.namePattern,
-                              annoVisitor);
-                          assert annotation.includesClassRetention()
-                              || annotation.includesRuntimeRetention();
-                          withNewVisitor(
-                              annoVisitor.visitArray(AnnotationPattern.retention),
-                              retentionArrayVisitor -> {
-                                if (annotation.includesClassRetention()) {
-                                  retentionArrayVisitor.visitEnum(
-                                      null,
-                                      "Ljava/lang/annotation/RetentionPolicy;",
-                                      RetentionPolicy.CLASS.name());
-                                }
-                                if (annotation.includesRuntimeRetention()) {
-                                  retentionArrayVisitor.visitEnum(
-                                      null,
-                                      "Ljava/lang/annotation/RetentionPolicy;",
-                                      RetentionPolicy.RUNTIME.name());
-                                }
-                              });
-                        });
-                  }));
-    }
-  }
-
-  private void writeItemReference(
-      AnnotationVisitor visitor, KeepBindingReference bindingReference) {
-    String bindingProperty =
-        bindingReference.isClassType() ? Item.classFromBinding : Item.memberFromBinding;
-    visitor.visit(bindingProperty, bindingReference.getName().toString());
-  }
-
-  private void writeItem(AnnotationVisitor itemVisitor, KeepItemPattern item) {
-    if (item.isClassItemPattern()) {
-      writeClassItem(item.asClassItemPattern(), itemVisitor);
-    } else {
-      writeMemberItem(item.asMemberItemPattern(), itemVisitor);
-    }
-  }
-
-  private void writeClassItem(
-      KeepClassItemPattern classItemPattern, AnnotationVisitor itemVisitor) {
-    writeAnnotatedBy(
-        Item.classAnnotatedByClassNamePattern,
-        classItemPattern.getAnnotatedByPattern(),
-        itemVisitor);
-    writeClassNamePattern(
-        classItemPattern.getClassNamePattern(), Item.classNamePattern, itemVisitor);
-    writeInstanceOfPattern(classItemPattern.getInstanceOfPattern(), itemVisitor);
-  }
-
-  private void writeInstanceOfPattern(
-      KeepInstanceOfPattern instanceOfPattern, AnnotationVisitor visitor) {
-    if (instanceOfPattern.isAny()) {
-      return;
-    }
-    withNewVisitor(
-        visitor.visitAnnotation(Item.instanceOfPattern, InstanceOfPattern.DESCRIPTOR),
-        v -> {
-          v.visit(InstanceOfPattern.inclusive, instanceOfPattern.isInclusive());
-          writeClassNamePattern(
-              instanceOfPattern.getClassNamePattern(), InstanceOfPattern.classNamePattern, v);
-        });
-  }
-
-  private void writeMemberItem(
-      KeepMemberItemPattern memberItemPattern, AnnotationVisitor itemVisitor) {
-    KeepClassBindingReference bindingReference = memberItemPattern.getClassReference();
-    itemVisitor.visit(Item.classFromBinding, bindingReference.getName().toString());
-    writeMember(memberItemPattern.getMemberPattern(), itemVisitor);
-  }
-
-  private void writeMember(KeepMemberPattern memberPattern, AnnotationVisitor targetVisitor) {
-    if (memberPattern.isAllMembers()) {
-      // Due to the empty default being a class, we need to set the kind to members.
-      targetVisitor.visitEnum(Target.kind, Kind.DESCRIPTOR, Kind.ONLY_MEMBERS);
-    } else if (memberPattern.isMethod()) {
-      writeMethod(memberPattern.asMethod(), targetVisitor);
-    } else if (memberPattern.isField()) {
-      writeField(memberPattern.asField(), targetVisitor);
-    } else {
-      writeGeneralMember(memberPattern, targetVisitor);
-    }
-  }
-
-  private void writeGeneralMember(KeepMemberPattern member, AnnotationVisitor targetVisitor) {
-    assert member.isGeneralMember();
-    assert !member.isField();
-    assert !member.isMethod();
-    writeAnnotatedBy(
-        Item.memberAnnotatedByClassNamePattern, member.getAnnotatedByPattern(), targetVisitor);
-    writeGeneralMemberAccessPattern(Item.memberAccess, member.getAccessPattern(), targetVisitor);
-  }
-
-  private void writeField(KeepFieldPattern field, AnnotationVisitor targetVisitor) {
-    writeAnnotatedBy(
-        Item.fieldAnnotatedByClassNamePattern, field.getAnnotatedByPattern(), targetVisitor);
-    writeFieldAccessPattern(Item.fieldAccess, field.getAccessPattern(), targetVisitor);
-    writeStringPattern(
-        field.getNamePattern().asStringPattern(), Item.fieldNamePattern, targetVisitor);
-    if (!field.getTypePattern().isAny()) {
-      writeTypePattern(field.getTypePattern().asType(), Item.fieldTypePattern, targetVisitor);
-    }
-  }
-
-  private void writeMethod(KeepMethodPattern method, AnnotationVisitor targetVisitor) {
-    writeAnnotatedBy(
-        Item.methodAnnotatedByClassNamePattern, method.getAnnotatedByPattern(), targetVisitor);
-    writeMethodAccessPattern(Item.methodAccess, method.getAccessPattern(), targetVisitor);
-    writeStringPattern(
-        method.getNamePattern().asStringPattern(), Item.methodNamePattern, targetVisitor);
-    writeMethodReturnType(method.getReturnTypePattern(), targetVisitor);
-    writeMethodParameters(method.getParametersPattern(), targetVisitor);
-  }
-
-  private void writeMethodParameters(
-      KeepMethodParametersPattern parametersPattern, AnnotationVisitor targetVisitor) {
-    if (parametersPattern.isAny()) {
-      return;
-    }
-    withNewVisitor(
-        targetVisitor.visitArray(Item.methodParameterTypePatterns),
-        v ->
-            parametersPattern
-                .asList()
-                .forEach(parameterPattern -> writeTypePattern(parameterPattern, null, v)));
-  }
-
-  private void writeMethodReturnType(
-      KeepMethodReturnTypePattern returnTypePattern, AnnotationVisitor targetVisitor) {
-    if (returnTypePattern.isAny()) {
-      return;
-    }
-    if (returnTypePattern.isVoid()) {
-      targetVisitor.visit(Item.methodReturnType, "void");
-      return;
-    }
-    assert returnTypePattern.isType();
-    writeTypePattern(returnTypePattern.asType(), Item.methodReturnTypePattern, targetVisitor);
-  }
-
-  private void writeTypePattern(
-      KeepTypePattern typePattern, String propertyName, AnnotationVisitor targetVisitor) {
-    withNewVisitor(
-        targetVisitor.visitAnnotation(propertyName, TypePattern.DESCRIPTOR),
-        v ->
-            typePattern.match(
-                () -> {
-                  // The empty type pattern matches any type.
-                },
-                primitive -> {
-                  if (primitive.isAny()) {
-                    throw new Unimplemented("No support for any-primitive.");
-                  }
-                  v.visit(TypePattern.name, Type.getType(primitive.getDescriptor()).getClassName());
-                },
-                array -> {
-                  v.visit(TypePattern.name, Type.getType(array.getDescriptor()).getClassName());
-                },
-                clazz -> {
-                  writeClassNamePattern(clazz, TypePattern.classNamePattern, v);
-                },
-                instanceOf -> {
-                  writeInstanceOfPattern(instanceOf, v);
-                }));
-  }
-
-  private void writeClassNamePattern(
-      KeepQualifiedClassNamePattern clazz, String propertyName, AnnotationVisitor visitor) {
-    withNewVisitor(
-        visitor.visitAnnotation(propertyName, ClassNamePattern.DESCRIPTOR),
-        v -> {
-          if (clazz.isAny()) {
-            // The empty pattern matches any class-name
-            return;
-          }
-          KeepPackagePattern packagePattern = clazz.getPackagePattern();
-          if (!packagePattern.isAny()) {
-            assert packagePattern.isExact();
-            v.visit(ClassNamePattern.packageName, packagePattern.getExactPackageAsString());
-          }
-          writeStringPattern(
-              clazz.getNamePattern().asStringPattern(), ClassNamePattern.unqualifiedNamePattern, v);
-        });
-  }
-
-  private void writeAnnotatedBy(
-      String propertyName,
-      OptionalPattern<KeepQualifiedClassNamePattern> annotatedByPattern,
-      AnnotationVisitor targetVisitor) {
-    if (annotatedByPattern.isPresent()) {
-      writeClassNamePattern(annotatedByPattern.get(), propertyName, targetVisitor);
-    }
-  }
-
-  private void writeModifierEnumValue(
-      ModifierPattern pattern, String value, String desc, AnnotationVisitor arrayVisitor) {
-    if (pattern.isAny()) {
-      return;
-    }
-    if (pattern.isOnlyPositive()) {
-      arrayVisitor.visitEnum(null, desc, value);
-      return;
-    }
-    assert pattern.isOnlyNegative();
-    arrayVisitor.visitEnum(null, desc, MemberAccess.NEGATION_PREFIX + value);
-  }
-
-  private void writeGeneralMemberAccessPattern(
-      String propertyName, KeepMemberAccessPattern accessPattern, AnnotationVisitor targetVisitor) {
-    internalWriteAccessPattern(
-        propertyName, accessPattern, targetVisitor, MemberAccess.DESCRIPTOR, v -> {});
-  }
-
-  private void writeFieldAccessPattern(
-      String propertyName, KeepFieldAccessPattern accessPattern, AnnotationVisitor targetVisitor) {
-    String enumDescriptor = FieldAccess.DESCRIPTOR;
-    internalWriteAccessPattern(
-        propertyName,
-        accessPattern,
-        targetVisitor,
-        enumDescriptor,
-        visitor -> {
-          writeModifierEnumValue(
-              accessPattern.getVolatilePattern(), FieldAccess.VOLATILE, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getTransientPattern(), FieldAccess.TRANSIENT, enumDescriptor, visitor);
-        });
-  }
-
-  private void writeMethodAccessPattern(
-      String propertyName, KeepMethodAccessPattern accessPattern, AnnotationVisitor targetVisitor) {
-    String enumDescriptor = MethodAccess.DESCRIPTOR;
-    internalWriteAccessPattern(
-        propertyName,
-        accessPattern,
-        targetVisitor,
-        enumDescriptor,
-        visitor -> {
-          writeModifierEnumValue(
-              accessPattern.getSynchronizedPattern(),
-              MethodAccess.SYNCHRONIZED,
-              enumDescriptor,
-              visitor);
-          writeModifierEnumValue(
-              accessPattern.getBridgePattern(), MethodAccess.BRIDGE, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getNativePattern(), MethodAccess.NATIVE, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getAbstractPattern(), MethodAccess.ABSTRACT, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getStrictFpPattern(), MethodAccess.STRICT_FP, enumDescriptor, visitor);
-        });
-  }
-
-  private void internalWriteAccessPattern(
-      String propertyName,
-      KeepMemberAccessPattern accessPattern,
-      AnnotationVisitor targetVisitor,
-      String enumDescriptor,
-      Consumer<AnnotationVisitor> typeSpecificSettings) {
-    if (accessPattern.isAny()) {
-      return;
-    }
-    withNewVisitor(
-        targetVisitor.visitArray(propertyName),
-        visitor -> {
-          if (!accessPattern.isAnyVisibility()) {
-            for (AccessVisibility visibility : accessPattern.getAllowedAccessVisibilities()) {
-              switch (visibility) {
-                case PUBLIC:
-                  visitor.visitEnum(null, enumDescriptor, MemberAccess.PUBLIC);
-                  break;
-                case PROTECTED:
-                  visitor.visitEnum(null, enumDescriptor, MemberAccess.PROTECTED);
-                  break;
-                case PACKAGE_PRIVATE:
-                  visitor.visitEnum(null, enumDescriptor, MemberAccess.PACKAGE_PRIVATE);
-                  break;
-                case PRIVATE:
-                  visitor.visitEnum(null, enumDescriptor, MemberAccess.PRIVATE);
-                  break;
-              }
-            }
-          }
-          writeModifierEnumValue(
-              accessPattern.getStaticPattern(), MemberAccess.STATIC, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getFinalPattern(), MemberAccess.FINAL, enumDescriptor, visitor);
-          writeModifierEnumValue(
-              accessPattern.getSyntheticPattern(), MemberAccess.SYNTHETIC, enumDescriptor, visitor);
-
-          typeSpecificSettings.accept(visitor);
-        });
-  }
-}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AccessVisibility.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AccessVisibility.java
index 690bae6..19e72a5 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AccessVisibility.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AccessVisibility.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 import java.util.HashSet;
@@ -42,4 +43,35 @@
   public static Set<AccessVisibility> all() {
     return ALL;
   }
+
+  public KeepSpecProtos.AccessVisibility buildProto() {
+    switch (this) {
+      case PUBLIC:
+        return KeepSpecProtos.AccessVisibility.ACCESS_PUBLIC;
+      case PROTECTED:
+        return KeepSpecProtos.AccessVisibility.ACCESS_PROTECTED;
+      case PACKAGE_PRIVATE:
+        return KeepSpecProtos.AccessVisibility.ACCESS_PACKAGE_PRIVATE;
+      case PRIVATE:
+        return KeepSpecProtos.AccessVisibility.ACCESS_PRIVATE;
+      default:
+        return KeepSpecProtos.AccessVisibility.ACCESS_UNSPECIFIED;
+    }
+  }
+
+  public static AccessVisibility fromProto(KeepSpecProtos.AccessVisibility proto) {
+    switch (proto.getNumber()) {
+      case KeepSpecProtos.AccessVisibility.ACCESS_PUBLIC_VALUE:
+        return PUBLIC;
+      case KeepSpecProtos.AccessVisibility.ACCESS_PROTECTED_VALUE:
+        return PROTECTED;
+      case KeepSpecProtos.AccessVisibility.ACCESS_PACKAGE_PRIVATE_VALUE:
+        return PACKAGE_PRIVATE;
+      case KeepSpecProtos.AccessVisibility.ACCESS_PRIVATE_VALUE:
+        return PRIVATE;
+      default:
+        assert proto == KeepSpecProtos.AccessVisibility.ACCESS_UNSPECIFIED;
+        return null;
+    }
+  }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
index 77643cd..fa6d13a 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
@@ -15,23 +15,6 @@
  * annotations which overlap in name with the actual semantic AST types.
  */
 public final class AnnotationConstants {
-  public static final class ExtractedAnnotations {
-    public static final String DESCRIPTOR =
-        "Lcom/android/tools/r8/keepanno/annotations/ExtractedKeepAnnotations;";
-    public static final String value = "value";
-  }
-
-  public static final class ExtractedAnnotation {
-    public static final String DESCRIPTOR =
-        "Lcom/android/tools/r8/keepanno/annotations/ExtractedKeepAnnotation;";
-    public static final String version = "version";
-    public static final String context = "context";
-    public static final String keepAnnotationGroup = "keep-annotation";
-    public static final String edge = "edge";
-    public static final String checkRemoved = "checkRemoved";
-    public static final String checkOptimizedOut = "checkOptimizedOut";
-  }
-
   public static final class Edge {
     public static final String DESCRIPTOR = "Lcom/android/tools/r8/keepanno/annotations/KeepEdge;";
     public static final String description = "description";
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepAnnotationPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepAnnotationPattern.java
index 5c7cf96..13d4df3 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepAnnotationPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepAnnotationPattern.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.AnnotationPattern;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.AnnotationRetention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Objects;
 
@@ -38,6 +40,21 @@
     return new Builder();
   }
 
+  public static KeepAnnotationPattern fromProto(AnnotationPattern proto) {
+    return builder().applyProto(proto).build();
+  }
+
+  public AnnotationPattern.Builder buildProto() {
+    AnnotationPattern.Builder builder = AnnotationPattern.newBuilder();
+    builder.setName(namePattern.buildProto());
+    if (retentionPolicies == RUNTIME_RETENTION_MASK) {
+      builder.setRetention(AnnotationRetention.RETENTION_RUNTIME);
+    } else if (retentionPolicies == CLASS_RETENTION_MASK) {
+      builder.setRetention(AnnotationRetention.RETENTION_CLASS);
+    }
+    return builder;
+  }
+
   public static class Builder {
 
     private KeepQualifiedClassNamePattern namePattern = KeepQualifiedClassNamePattern.any();
@@ -45,6 +62,31 @@
 
     private Builder() {}
 
+    public Builder applyProto(AnnotationPattern proto) {
+      assert namePattern.isAny();
+      if (proto.hasName()) {
+        setNamePattern(KeepQualifiedClassNamePattern.fromProto(proto.getName()));
+      }
+      // The builder is configured to check that retention is set.
+      // Thus, we apply the default case here explicitly.
+      assert retentionPolicies != ANY_RETENTION_MASK;
+      retentionPolicies = ANY_RETENTION_MASK;
+      if (proto.hasRetention()) {
+        switch (proto.getRetention().getNumber()) {
+          case AnnotationRetention.RETENTION_RUNTIME_VALUE:
+            retentionPolicies = RUNTIME_RETENTION_MASK;
+            break;
+          case AnnotationRetention.RETENTION_CLASS_VALUE:
+            retentionPolicies = CLASS_RETENTION_MASK;
+            break;
+          default:
+            // default any applies.
+            assert retentionPolicies == ANY_RETENTION_MASK;
+        }
+      }
+      return this;
+    }
+
     public Builder setNamePattern(KeepQualifiedClassNamePattern namePattern) {
       this.namePattern = namePattern;
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
index 28ff0b1..b0045f5 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Bindings;
 import java.util.Collections;
@@ -88,6 +89,13 @@
             .collect(Collectors.joining(", "));
   }
 
+  public static BindingResolver fromProto(Bindings proto) {
+    if (proto == null) {
+      throw new KeepEdgeException("Invalid keep spec, must have valid bindings.");
+    }
+    return new BindingResolver(builder().applyProto(proto));
+  }
+
   public KeepSpecProtos.Bindings.Builder buildProto() {
     KeepSpecProtos.Bindings.Builder builder = KeepSpecProtos.Bindings.newBuilder();
     bindings.forEach(
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java
index c59fe13..c7d6d84 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Check;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.CheckKind;
@@ -36,19 +37,11 @@
           setKind(KeepCheckKind.REMOVED);
       }
 
-      // Bindings are not optional.
-      if (!proto.hasBindings()) {
-        throw new KeepEdgeException("Invalid Check, must have valid bindings.");
-      }
-      KeepBindings.Builder bindingsBuilder = KeepBindings.builder().applyProto(proto.getBindings());
-      setBindings(bindingsBuilder.build());
-
-      // The check item reference is not optional.
-      if (!proto.hasItem() || proto.getItem().getName().isEmpty()) {
-        throw new KeepEdgeException("Invalid check, must have a valid item reference.");
-      }
-      setItemReference(
-          bindingsBuilder.getBindingReferenceForUserBinding(proto.getItem().getName()));
+      // Bindings are non-optional (checked in fromProto).
+      BindingResolver resolver = KeepBindings.fromProto(proto.getBindings());
+      setBindings(resolver.getBindings());
+      // Item is non-optional (checked in mapReference).
+      setItemReference(resolver.mapReference(proto.getItem()));
       return this;
     }
 
@@ -131,7 +124,12 @@
 
   @Override
   public String toString() {
-    return "KeepCheck{kind=" + kind + ", item=" + itemReference + "}";
+    return toProtoString();
+  }
+
+  @Override
+  public String toProtoString() {
+    return buildCheckProto().toString();
   }
 
   public static KeepCheck fromCheckProto(Check proto, KeepSpecVersion version) {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepClassItemPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepClassItemPattern.java
index 8d27307..4ccfad3 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepClassItemPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepClassItemPattern.java
@@ -24,9 +24,10 @@
   }
 
   public ClassItemPattern.Builder buildClassProto() {
-    // TODO(b/343389186): Add instance-of.
-    // TODO(b/343389186): Add annotated-by.
-    return ClassItemPattern.newBuilder().setClassName(classNamePattern.buildProto());
+    ClassItemPattern.Builder builder = ClassItemPattern.newBuilder();
+    KeepSpecUtils.buildAnnotatedByProto(annotatedByPattern, builder::setAnnotatedBy);
+    instanceOfPattern.buildProto(builder::setInstanceOf);
+    return builder.setClassName(classNamePattern.buildProto());
   }
 
   public static class Builder {
@@ -43,9 +44,14 @@
       if (protoItem.hasClassName()) {
         setClassNamePattern(KeepQualifiedClassNamePattern.fromProto(protoItem.getClassName()));
       }
-
-      // TODO(b/343389186): Add instance-of.
-      // TODO(b/343389186): Add annotated-by.
+      assert annotatedByPattern.isAbsent();
+      if (protoItem.hasAnnotatedBy()) {
+        setAnnotatedByPattern(KeepSpecUtils.annotatedByFromProto(protoItem.getAnnotatedBy()));
+      }
+      assert instanceOfPattern.isAny();
+      if (protoItem.hasInstanceOf()) {
+        setInstanceOfPattern(KeepInstanceOfPattern.fromProto(protoItem.getInstanceOf()));
+      }
       return this;
     }
 
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCondition.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCondition.java
index 96c0f4d..7e619d9 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCondition.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCondition.java
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Condition;
+
 /**
  * A keep condition is the content of an item in the set of preconditions.
  *
@@ -17,12 +20,25 @@
     return new Builder();
   }
 
+  public Condition.Builder buildProto() {
+    return Condition.newBuilder().setItem(item.buildProto());
+  }
+
+  public static KeepCondition fromProto(Condition proto, BindingResolver resolver) {
+    return builder().applyProto(proto, resolver).build();
+  }
+
   public static class Builder {
 
     private KeepBindingReference item;
 
     private Builder() {}
 
+    public Builder applyProto(Condition proto, BindingResolver resolver) {
+      // Item is not optional and the resolver will throw if not present.
+      return setItemReference(resolver.mapReference(proto.getItem()));
+    }
+
     public Builder setItemReference(KeepBindingReference item) {
       this.item = item;
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConsequences.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConsequences.java
index 1322746..2fdc4c3 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConsequences.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConsequences.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Target;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -11,19 +13,30 @@
 /**
  * Set of consequences of a keep edge.
  *
- * <p>The consequences are "targets" described by item patterns along with "keep options" which
+ * <p>The consequences are "targets" described by item references along with "keep options" which
  * detail what aspects of the items must be retained.
  *
  * <p>The consequences come into effect if the preconditions of an edge are met.
  */
 public final class KeepConsequences {
 
+  public static KeepConsequences fromProto(List<Target> protoList, BindingResolver resolver) {
+    return builder().applyProto(protoList, resolver).build();
+  }
+
   public static class Builder {
 
     private List<KeepTarget> targets = new ArrayList<>();
 
     private Builder() {}
 
+    public Builder applyProto(List<Target> protoList, BindingResolver resolver) {
+      for (Target target : protoList) {
+        addTarget(KeepTarget.fromProto(target, resolver));
+      }
+      return this;
+    }
+
     public Builder addTarget(KeepTarget target) {
       targets.add(target);
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraint.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraint.java
index 2ae5f93..f33e14e 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraint.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraint.java
@@ -5,10 +5,67 @@
 
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Constraints;
 import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Constraint;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.ConstraintElement;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public abstract class KeepConstraint {
 
+  public Constraint.Builder buildProto() {
+    return Constraint.newBuilder().setElement(buildElementProto());
+  }
+
+  public abstract ConstraintElement buildElementProto();
+
+  public static void fromProto(Constraint proto, Consumer<KeepConstraint> callback) {
+    if (proto.hasElement()) {
+      KeepConstraint constraint = getConstraintFromProtoEnum(proto.getElement());
+      if (constraint != null) {
+        callback.accept(constraint);
+      }
+      return;
+    }
+    if (proto.hasAnnotation()) {
+      callback.accept(
+          KeepConstraint.annotation(KeepAnnotationPattern.fromProto(proto.getAnnotation())));
+    }
+  }
+
+  private static KeepConstraint getConstraintFromProtoEnum(ConstraintElement proto) {
+    switch (proto.getNumber()) {
+      case ConstraintElement.CONSTRAINT_LOOKUP_VALUE:
+        return lookup();
+      case ConstraintElement.CONSTRAINT_NAME_VALUE:
+        return name();
+      case ConstraintElement.CONSTRAINT_VISIBILITY_RELAX_VALUE:
+        return visibilityRelax();
+      case ConstraintElement.CONSTRAINT_VISIBILITY_RESTRICT_VALUE:
+        return visibilityRestrict();
+      case ConstraintElement.CONSTRAINT_NEVER_INLINE_VALUE:
+        return neverInline();
+      case ConstraintElement.CONSTRAINT_CLASS_INSTANTIATE_VALUE:
+        return classInstantiate();
+      case ConstraintElement.CONSTRAINT_CLASS_OPEN_HIERARCHY_VALUE:
+        return classOpenHierarchy();
+      case ConstraintElement.CONSTRAINT_METHOD_INVOKE_VALUE:
+        return methodInvoke();
+      case ConstraintElement.CONSTRAINT_METHOD_REPLACE_VALUE:
+        return methodReplace();
+      case ConstraintElement.CONSTRAINT_FIELD_GET_VALUE:
+        return fieldGet();
+      case ConstraintElement.CONSTRAINT_FIELD_SET_VALUE:
+        return fieldSet();
+      case ConstraintElement.CONSTRAINT_FIELD_REPLACE_VALUE:
+        return fieldReplace();
+      case ConstraintElement.CONSTRAINT_GENERIC_SIGNATURE_VALUE:
+        return genericSignature();
+      default:
+        assert proto == ConstraintElement.CONSTRAINT_UNSPECIFIED;
+        return null;
+    }
+  }
+
   @Override
   public String toString() {
     String typeName = getClass().getTypeName();
@@ -87,6 +144,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.SHRINKING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_LOOKUP;
+    }
   }
 
   public static Name name() {
@@ -113,6 +175,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OBFUSCATING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_NAME;
+    }
   }
 
   public static VisibilityRelax visibilityRelax() {
@@ -139,6 +206,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       // The compiler currently satisfies that access is never restricted.
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_VISIBILITY_RELAX;
+    }
   }
 
   public static VisibilityRestrict visibilityRestrict() {
@@ -166,6 +238,11 @@
       // We don't have directional rules so this prohibits any modification.
       builder.add(KeepOption.ACCESS_MODIFICATION);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_VISIBILITY_RESTRICT;
+    }
   }
 
   public static NeverInline neverInline() {
@@ -192,6 +269,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_NEVER_INLINE;
+    }
   }
 
   public static ClassInstantiate classInstantiate() {
@@ -223,6 +305,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_CLASS_INSTANTIATE;
+    }
   }
 
   public static ClassOpenHierarchy classOpenHierarchy() {
@@ -254,6 +341,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_CLASS_OPEN_HIERARCHY;
+    }
   }
 
   public static MethodInvoke methodInvoke() {
@@ -285,6 +377,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_METHOD_INVOKE;
+    }
   }
 
   public static MethodReplace methodReplace() {
@@ -316,6 +413,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_METHOD_REPLACE;
+    }
   }
 
   public static FieldGet fieldGet() {
@@ -347,6 +449,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_FIELD_GET;
+    }
   }
 
   public static FieldSet fieldSet() {
@@ -378,6 +485,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_FIELD_SET;
+    }
   }
 
   public static FieldReplace fieldReplace() {
@@ -409,6 +521,11 @@
     public void convertToDisallowKeepOptions(KeepOptions.Builder builder) {
       builder.add(KeepOption.OPTIMIZING);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_FIELD_REPLACE;
+    }
   }
 
   public static GenericSignature genericSignature() {
@@ -440,6 +557,11 @@
     public void addRequiredKeepAttributes(Set<KeepAttribute> attributes) {
       attributes.add(KeepAttribute.GENERIC_SIGNATURES);
     }
+
+    @Override
+    public ConstraintElement buildElementProto() {
+      return ConstraintElement.CONSTRAINT_GENERIC_SIGNATURE;
+    }
   }
 
   public static Annotation annotationsAll() {
@@ -496,6 +618,16 @@
     }
 
     @Override
+    public ConstraintElement buildElementProto() {
+      throw new KeepEdgeException("Unexpected attempt to build element for annotation constraint");
+    }
+
+    @Override
+    public Constraint.Builder buildProto() {
+      return Constraint.newBuilder().setAnnotation(annotationPattern.buildProto());
+    }
+
+    @Override
     public void accept(KeepConstraintVisitor visitor) {
       visitor.onAnnotation(this);
     }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
index 6c55e6c..01c8844 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
@@ -6,11 +6,14 @@
 
 import com.android.tools.r8.keepanno.ast.KeepConstraint.Annotation;
 import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
 import com.google.common.collect.ImmutableSet;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -41,6 +44,27 @@
     getConstraints().forEach(c -> c.accept(visitor));
   }
 
+  public abstract void buildProto(
+      Consumer<KeepSpecProtos.Constraints> setConstraints,
+      Consumer<KeepSpecProtos.Constraint> addConstraintAddition);
+
+  public void fromProto(
+      KeepSpecProtos.Constraints proto,
+      List<KeepSpecProtos.Constraint> protoAdditions,
+      Consumer<KeepConstraints> setConstraints) {
+    if (proto == null && protoAdditions.isEmpty()) {
+      return;
+    }
+    Builder builder = builder();
+    if (proto == null) {
+      builder.copyFrom(defaultConstraints());
+    } else {
+      proto.getConstraintsList().forEach(c -> KeepConstraint.fromProto(c, builder::add));
+    }
+    protoAdditions.forEach(c -> KeepConstraint.fromProto(c, builder::add));
+    setConstraints.accept(builder.build());
+  }
+
   public static class Builder {
 
     private boolean defaultAdditions = false;
@@ -149,6 +173,15 @@
     public KeepOptions convertToKeepOptions(KeepOptions defaultOptions) {
       return KeepOptions.keepAll();
     }
+
+    @Override
+    public void buildProto(
+        Consumer<KeepSpecProtos.Constraints> setConstraints,
+        Consumer<KeepSpecProtos.Constraint> addConstraintAddition) {
+      KeepSpecProtos.Constraints.Builder builder = KeepSpecProtos.Constraints.newBuilder();
+      constraints.forEach(c -> builder.addConstraints(c.buildProto()));
+      setConstraints.accept(builder.build());
+    }
   }
 
   private static class Defaults extends KeepConstraints {
@@ -165,6 +198,11 @@
             KeepConstraint.fieldSet());
 
     @Override
+    public boolean isDefault() {
+      return true;
+    }
+
+    @Override
     Set<KeepConstraint> getConstraints() {
       return constraints;
     }
@@ -184,6 +222,13 @@
       // The default set of keep rules for any kind of target requires no additional attributes.
       return Collections.emptySet();
     }
+
+    @Override
+    public void buildProto(
+        Consumer<KeepSpecProtos.Constraints> setConstraints,
+        Consumer<KeepSpecProtos.Constraint> addConstraintAddition) {
+      // Nothing to add as these are the defaults.
+    }
   }
 
   private static class Additions extends KeepConstraints {
@@ -218,6 +263,15 @@
     public Set<KeepAttribute> getRequiredKeepAttributes() {
       return additions.getRequiredKeepAttributes();
     }
+
+    @Override
+    public void buildProto(
+        Consumer<KeepSpecProtos.Constraints> setConstraints,
+        Consumer<KeepSpecProtos.Constraint> addConstraintAddition) {
+      // Map all nested constraints into additions.
+      additions.buildProto(
+          cs -> cs.getConstraintsList().forEach(addConstraintAddition), addConstraintAddition);
+    }
   }
 
   private static class Constraints extends KeepConstraints {
@@ -229,6 +283,15 @@
     }
 
     @Override
+    public void buildProto(
+        Consumer<KeepSpecProtos.Constraints> setConstraints,
+        Consumer<KeepSpecProtos.Constraint> addConstraintAddition) {
+      KeepSpecProtos.Constraints.Builder builder = KeepSpecProtos.Constraints.newBuilder();
+      constraints.forEach(c -> builder.addConstraints(c.buildProto()));
+      setConstraints.accept(builder.build());
+    }
+
+    @Override
     public Set<KeepConstraint> getConstraints() {
       return constraints;
     }
@@ -262,4 +325,8 @@
   public abstract KeepOptions convertToKeepOptions(KeepOptions defaultOptions);
 
   public abstract Set<KeepAttribute> getRequiredKeepAttributes();
+
+  public boolean isDefault() {
+    return false;
+  }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
index 12d1d31..a2cc7de 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
@@ -50,6 +50,8 @@
     throw new RuntimeException();
   }
 
+  public abstract String toProtoString();
+
   public final Declaration.Builder buildDeclarationProto() {
     Declaration.Builder builder = Declaration.newBuilder();
     return apply(
@@ -57,13 +59,13 @@
         check -> builder.setCheck(check.buildCheckProto()));
   }
 
-  public static KeepDeclaration fromProto(
+  public static KeepDeclaration fromDeclarationProto(
       KeepSpecProtos.Declaration declaration, KeepSpecVersion version) {
     if (declaration.hasEdge()) {
-      return KeepEdge.builder().applyProto(declaration.getEdge(), version).build();
+      return KeepEdge.fromEdgeProto(declaration.getEdge(), version);
     }
     if (declaration.hasCheck()) {
-      return KeepCheck.builder().applyProto(declaration.getCheck(), version).build();
+      return KeepCheck.fromCheckProto(declaration.getCheck(), version);
     }
     return null;
   }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
index 3060010..ff8e507 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Edge;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
 
 /**
  * An edge in the keep graph.
@@ -147,9 +147,14 @@
 
     private Builder() {}
 
-    public Builder applyProto(Edge edge, KeepSpecVersion version) {
-      // TODO(b/343389186): implement this.
-      KeepEdgeMetaInfo.builder().applyProto(edge.getMetaInfo(), version).build();
+    public Builder applyProto(Edge proto, KeepSpecVersion version) {
+      // Proto MetaInfo is optional but the `fromProto` deals with the null case.
+      setMetaInfo(KeepEdgeMetaInfo.fromProto(proto.getMetaInfo(), version));
+      // Bindings are non-optional (checked in fromProto).
+      BindingResolver resolver = KeepBindings.fromProto(proto.getBindings());
+      setBindings(resolver.getBindings());
+      setPreconditions(KeepPreconditions.fromProto(proto.getPreconditionsList(), resolver));
+      setConsequences(KeepConsequences.fromProto(proto.getConsequencesList(), resolver));
       return this;
     }
 
@@ -257,17 +262,24 @@
 
   @Override
   public String toString() {
-    return "KeepEdge{metainfo="
-        + getMetaInfo()
-        + ", preconditions="
-        + preconditions
-        + ", consequences="
-        + consequences
-        + '}';
+    return toProtoString();
+  }
+
+  @Override
+  public String toProtoString() {
+    return buildEdgeProto().toString();
+  }
+
+  public static KeepEdge fromEdgeProto(Edge proto, KeepSpecVersion version) {
+    return KeepEdge.builder().applyProto(proto, version).build();
   }
 
   public Edge.Builder buildEdgeProto() {
-    Edge.newBuilder().setMetaInfo(getMetaInfo().buildProto());
-    throw new Unimplemented();
+    Edge.Builder builder = Edge.newBuilder();
+    builder.setMetaInfo(getMetaInfo().buildProto());
+    builder.setBindings(bindings.buildProto());
+    preconditions.forEach(condition -> builder.addPreconditions(condition.buildProto()));
+    consequences.forEachTarget(target -> builder.addConsequences(target.buildProto()));
+    return builder;
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldAccessPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldAccessPattern.java
index 55c15c2..b9bf204 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldAccessPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldAccessPattern.java
@@ -5,7 +5,9 @@
 
 import com.android.tools.r8.keepanno.keeprules.RulePrinter;
 import com.android.tools.r8.keepanno.keeprules.RulePrintingUtils;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberAccessField;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public class KeepFieldAccessPattern extends KeepMemberAccessPattern {
 
@@ -41,6 +43,10 @@
     this.transientPattern = transientPattern;
   }
 
+  public static KeepFieldAccessPattern fromFieldProto(MemberAccessField proto) {
+    return builder().applyFieldProto(proto).build();
+  }
+
   @Override
   public String toString() {
     if (isAny()) {
@@ -64,6 +70,17 @@
     return transientPattern;
   }
 
+  public void buildFieldProto(Consumer<MemberAccessField.Builder> callback) {
+    if (isAny()) {
+      return;
+    }
+    MemberAccessField.Builder builder = MemberAccessField.newBuilder();
+    buildGeneralProto(builder::setGeneralAccess);
+    volatilePattern.buildProto(builder::setVolatilePattern);
+    transientPattern.buildProto(builder::setTransientPattern);
+    callback.accept(builder);
+  }
+
   public static class Builder extends BuilderBase<KeepFieldAccessPattern, Builder> {
 
     private ModifierPattern volatilePattern = ModifierPattern.any();
@@ -106,5 +123,20 @@
     public ModifierPattern getTransientPattern() {
       return transientPattern;
     }
+
+    public Builder applyFieldProto(MemberAccessField proto) {
+      if (proto.hasGeneralAccess()) {
+        applyGeneralProto(proto.getGeneralAccess());
+      }
+      assert volatilePattern.isAny();
+      if (proto.hasVolatilePattern()) {
+        setVolatile(proto.getVolatilePattern().getValue());
+      }
+      assert transientPattern.isAny();
+      if (proto.hasTransientPattern()) {
+        setTransient(proto.getTransientPattern().getValue());
+      }
+      return this;
+    }
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
index f863c2e..d6ec06d 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.keepanno.ast;
 
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberPatternField;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
 import java.util.Objects;
 
 public final class KeepFieldPattern extends KeepMemberPattern {
@@ -31,6 +30,31 @@
       return this;
     }
 
+    public Builder applyProto(MemberPatternField proto) {
+      assert namePattern.isAny();
+      if (proto.hasName()) {
+        setNamePattern(
+            KeepFieldNamePattern.fromStringPattern(KeepStringPattern.fromProto(proto.getName())));
+      }
+
+      assert typePattern.isAny();
+      if (proto.hasFieldType()) {
+        setTypePattern(
+            KeepFieldTypePattern.fromType(KeepTypePattern.fromProto(proto.getFieldType())));
+      }
+
+      assert accessPattern.isAny();
+      if (proto.hasAccess()) {
+        setAccessPattern(KeepFieldAccessPattern.fromFieldProto(proto.getAccess()));
+      }
+
+      assert annotatedByPattern.isAbsent();
+      if (proto.hasAnnotatedBy()) {
+        setAnnotatedByPattern(KeepSpecUtils.annotatedByFromProto(proto.getAnnotatedBy()));
+      }
+      return self();
+    }
+
     public Builder copyFromMemberPattern(KeepMemberPattern memberPattern) {
       assert memberPattern.isGeneralMember();
       return setAccessPattern(
@@ -148,7 +172,17 @@
         + '}';
   }
 
+  public static KeepFieldPattern fromFieldMemberProto(MemberPatternField proto) {
+    return builder().applyProto(proto).build();
+  }
+
   public MemberPatternField.Builder buildFieldProto() {
-    throw new Unimplemented();
+    MemberPatternField.Builder builder =
+        MemberPatternField.newBuilder()
+            .setName(namePattern.asStringPattern().buildProto())
+            .setFieldType(typePattern.asType().buildProto());
+    accessPattern.buildFieldProto(builder::setAccess);
+    KeepSpecUtils.buildAnnotatedByProto(annotatedByPattern, builder::setAnnotatedBy);
+    return builder;
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepInstanceOfPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepInstanceOfPattern.java
index 79e2f43..114ada8 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepInstanceOfPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepInstanceOfPattern.java
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.InstanceOfPattern;
+import java.util.function.Consumer;
+
 /** Pattern for matching the instance-of properties of a class. */
 public abstract class KeepInstanceOfPattern {
 
@@ -10,6 +13,20 @@
     return Some.getAnyInstance();
   }
 
+  public static KeepInstanceOfPattern fromProto(InstanceOfPattern proto) {
+    return builder().applyProto(proto).build();
+  }
+
+  public void buildProto(Consumer<InstanceOfPattern.Builder> setter) {
+    if (isAny()) {
+      return;
+    }
+    setter.accept(
+        InstanceOfPattern.newBuilder()
+            .setInclusive(isInclusive())
+            .setClassName(getClassNamePattern().buildProto()));
+  }
+
   public static class Builder {
 
     private KeepQualifiedClassNamePattern namePattern = KeepQualifiedClassNamePattern.any();
@@ -17,6 +34,18 @@
 
     private Builder() {}
 
+    public Builder applyProto(InstanceOfPattern proto) {
+      assert namePattern.isAny();
+      if (proto.hasClassName()) {
+        classPattern(KeepQualifiedClassNamePattern.fromProto(proto.getClassName()));
+      }
+      assert isInclusive;
+      if (proto.hasInclusive()) {
+        setInclusive(proto.getInclusive());
+      }
+      return this;
+    }
+
     public Builder classPattern(KeepQualifiedClassNamePattern namePattern) {
       this.namePattern = namePattern;
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberAccessPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberAccessPattern.java
index 8b18105..487ddc8 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberAccessPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberAccessPattern.java
@@ -5,7 +5,11 @@
 
 import com.android.tools.r8.keepanno.keeprules.RulePrinter;
 import com.android.tools.r8.keepanno.keeprules.RulePrintingUtils;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.AccessVisibilitySet;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberAccessGeneral;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public class KeepMemberAccessPattern {
 
@@ -83,6 +87,28 @@
     return syntheticPattern;
   }
 
+  public static KeepMemberAccessPattern fromGeneralProto(MemberAccessGeneral proto) {
+    return memberBuilder().applyGeneralProto(proto).build();
+  }
+
+  public void buildGeneralProto(Consumer<MemberAccessGeneral.Builder> callback) {
+    if (isAny()) {
+      return;
+    }
+    MemberAccessGeneral.Builder builder = MemberAccessGeneral.newBuilder();
+    if (!isAnyVisibility()) {
+      AccessVisibilitySet.Builder visibilityBuilder = AccessVisibilitySet.newBuilder();
+      for (AccessVisibility visibility : allowedVisibilities) {
+        visibilityBuilder.addAccessVisibility(visibility.buildProto());
+      }
+      builder.setAccessVisibility(visibilityBuilder.build());
+    }
+    staticPattern.buildProto(builder::setStaticPattern);
+    finalPattern.buildProto(builder::setFinalPattern);
+    syntheticPattern.buildProto(builder::setSyntheticPattern);
+    callback.accept(builder);
+  }
+
   public static class Builder extends BuilderBase<KeepMemberAccessPattern, Builder> {
 
     @Override
@@ -185,5 +211,32 @@
       syntheticPattern = ModifierPattern.fromAllowValue(allow);
       return self();
     }
+
+    public B applyGeneralProto(MemberAccessGeneral proto) {
+      assert getAllowedVisibilities() == AccessVisibility.all();
+      if (proto.hasAccessVisibility()) {
+        AccessVisibilitySet protoSet = proto.getAccessVisibility();
+        for (KeepSpecProtos.AccessVisibility protoVisibility : protoSet.getAccessVisibilityList()) {
+          // Map "unspecified" value to no effect, e.g. any visibility.
+          AccessVisibility visibility = AccessVisibility.fromProto(protoVisibility);
+          if (visibility != null) {
+            setAccessVisibility(visibility, true);
+          }
+        }
+      }
+      assert staticPattern.isAny();
+      if (proto.hasStaticPattern()) {
+        setStatic(proto.getStaticPattern().getValue());
+      }
+      assert finalPattern.isAny();
+      if (proto.hasFinalPattern()) {
+        setFinal(proto.getFinalPattern().getValue());
+      }
+      assert syntheticPattern.isAny();
+      if (proto.hasSyntheticPattern()) {
+        setSynthetic(proto.getSyntheticPattern().getValue());
+      }
+      return self();
+    }
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
index 5c784bc..67bbcd2 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberPattern;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberPatternGeneral;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
 import java.util.Objects;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -21,9 +20,22 @@
   }
 
   public static class Builder {
-    private OptionalPattern<KeepQualifiedClassNamePattern> annotatedByPattern;
+    private OptionalPattern<KeepQualifiedClassNamePattern> annotatedByPattern =
+        OptionalPattern.absent();
     private KeepMemberAccessPattern accessPattern = KeepMemberAccessPattern.anyMemberAccess();
 
+    public Builder applyProto(MemberPatternGeneral proto) {
+      assert annotatedByPattern.isAbsent();
+      if (proto.hasAnnotatedBy()) {
+        setAnnotatedByPattern(KeepSpecUtils.annotatedByFromProto(proto.getAnnotatedBy()));
+      }
+      assert accessPattern.isAny();
+      if (proto.hasAccess()) {
+        setAccessPattern(KeepMemberAccessPattern.fromGeneralProto(proto.getAccess()));
+      }
+      return this;
+    }
+
     public Builder setAnnotatedByPattern(
         OptionalPattern<KeepQualifiedClassNamePattern> annotatedByPattern) {
       this.annotatedByPattern = annotatedByPattern;
@@ -94,8 +106,15 @@
           + '}';
     }
 
-    public MemberPatternGeneral.Builder buildGeneralProto() {
-      throw new Unimplemented();
+    public MemberPatternGeneral.Builder buildGeneralMemberProto() {
+      MemberPatternGeneral.Builder builder = MemberPatternGeneral.newBuilder();
+      accessPattern.buildGeneralProto(builder::setAccess);
+      KeepSpecUtils.buildAnnotatedByProto(annotatedByPattern, builder::setAnnotatedBy);
+      return builder;
+    }
+
+    public static KeepMemberPattern fromGeneralMemberProto(MemberPatternGeneral proto) {
+      return memberBuilder().applyProto(proto).build();
     }
   }
 
@@ -156,7 +175,7 @@
   public MemberPattern.Builder buildProto() {
     MemberPattern.Builder builder = MemberPattern.newBuilder();
     match(
-        general -> builder.setGeneralMember(((Some) general).buildGeneralProto()),
+        general -> builder.setGeneralMember(((Some) general).buildGeneralMemberProto()),
         field -> builder.setFieldMember(field.buildFieldProto()),
         method -> builder.setMethodMember(method.buildMethodProto()));
     return builder;
@@ -164,15 +183,13 @@
 
   public static KeepMemberPattern fromMemberProto(MemberPattern memberPattern) {
     if (memberPattern.hasGeneralMember()) {
-      // return KeepMemberPattern.memberBuilder().applyProto(memberPattern.getGeneralMember());
-      throw new Unimplemented();
+      return Some.fromGeneralMemberProto(memberPattern.getGeneralMember());
     }
     if (memberPattern.hasFieldMember()) {
-      // return KeepFieldPattern.builder().applyProto(memberPattern.getFieldMember());
-      throw new Unimplemented();
+      return KeepFieldPattern.fromFieldMemberProto(memberPattern.getFieldMember());
     }
     if (memberPattern.hasMethodMember()) {
-      return KeepMethodPattern.fromMethodProto(memberPattern.getMethodMember());
+      return KeepMethodPattern.fromMethodMemberProto(memberPattern.getMethodMember());
     }
     return KeepMemberPattern.allMembers();
   }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodAccessPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodAccessPattern.java
index c8f83b2..5b3a1bd 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodAccessPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodAccessPattern.java
@@ -5,7 +5,9 @@
 
 import com.android.tools.r8.keepanno.keeprules.RulePrinter;
 import com.android.tools.r8.keepanno.keeprules.RulePrintingUtils;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MemberAccessMethod;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public class KeepMethodAccessPattern extends KeepMemberAccessPattern {
 
@@ -53,6 +55,24 @@
     this.strictFpPattern = strictFpPattern;
   }
 
+  public static KeepMethodAccessPattern fromMethodProto(MemberAccessMethod proto) {
+    return builder().applyMethodProto(proto).build();
+  }
+
+  public void buildMethodProto(Consumer<MemberAccessMethod.Builder> callback) {
+    if (isAny()) {
+      return;
+    }
+    MemberAccessMethod.Builder builder = MemberAccessMethod.newBuilder();
+    buildGeneralProto(builder::setGeneralAccess);
+    synchronizedPattern.buildProto(builder::setSynchronizedPattern);
+    bridgePattern.buildProto(builder::setBridgePattern);
+    nativePattern.buildProto(builder::setNativePattern);
+    abstractPattern.buildProto(builder::setAbstractPattern);
+    strictFpPattern.buildProto(builder::setStrictFpPattern);
+    callback.accept(builder);
+  }
+
   @Override
   public String toString() {
     if (isAny()) {
@@ -123,6 +143,33 @@
       return pattern.isAny() ? anyMethodAccess() : pattern;
     }
 
+    public Builder applyMethodProto(MemberAccessMethod proto) {
+      if (proto.hasGeneralAccess()) {
+        applyGeneralProto(proto.getGeneralAccess());
+      }
+      assert synchronizedPattern.isAny();
+      if (proto.hasSynchronizedPattern()) {
+        setSynchronized(proto.getSynchronizedPattern().getValue());
+      }
+      assert bridgePattern.isAny();
+      if (proto.hasBridgePattern()) {
+        setBridge(proto.getBridgePattern().getValue());
+      }
+      assert nativePattern.isAny();
+      if (proto.hasNativePattern()) {
+        setNative(proto.getNativePattern().getValue());
+      }
+      assert abstractPattern.isAny();
+      if (proto.hasAbstractPattern()) {
+        setAbstract(proto.getAbstractPattern().getValue());
+      }
+      assert strictFpPattern.isAny();
+      if (proto.hasStrictFpPattern()) {
+        setStrictFp(proto.getStrictFpPattern().getValue());
+      }
+      return this;
+    }
+
     public Builder setSynchronized(boolean allow) {
       synchronizedPattern = ModifierPattern.fromAllowValue(allow);
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
index 504bba8..11f5cea 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
@@ -34,17 +34,16 @@
       return this;
     }
 
-    public Builder applyProto(MemberPatternMethod methodMember) {
+    public Builder applyProto(MemberPatternMethod proto) {
       assert namePattern.isAny();
-      if (methodMember.hasName()) {
+      if (proto.hasName()) {
         setNamePattern(
-            KeepMethodNamePattern.fromStringPattern(
-                KeepStringPattern.fromProto(methodMember.getName())));
+            KeepMethodNamePattern.fromStringPattern(KeepStringPattern.fromProto(proto.getName())));
       }
 
       assert returnTypePattern.isAny();
-      if (methodMember.hasReturnType()) {
-        MethodReturnTypePattern returnType = methodMember.getReturnType();
+      if (proto.hasReturnType()) {
+        MethodReturnTypePattern returnType = proto.getReturnType();
         if (returnType.hasVoidType()) {
           setReturnTypeVoid();
         } else if (returnType.hasSomeType()) {
@@ -55,8 +54,8 @@
       }
 
       assert parametersPattern.isAny();
-      if (methodMember.hasParameterTypes()) {
-        MethodParameterTypesPattern parameterTypes = methodMember.getParameterTypes();
+      if (proto.hasParameterTypes()) {
+        MethodParameterTypesPattern parameterTypes = proto.getParameterTypes();
         KeepMethodParametersPattern.Builder parametersBuilder =
             KeepMethodParametersPattern.builder();
         for (TypePattern typePattern : parameterTypes.getTypesList()) {
@@ -65,8 +64,15 @@
         setParametersPattern(parametersBuilder.build());
       }
 
-      // TODO(b/343389186): Add annotated-by.
-      // TODO(b/343389186): Add access.
+      assert accessPattern.isAny();
+      if (proto.hasAccess()) {
+        setAccessPattern(KeepMethodAccessPattern.fromMethodProto(proto.getAccess()));
+      }
+
+      assert annotatedByPattern.isAbsent();
+      if (proto.hasAnnotatedBy()) {
+        setAnnotatedByPattern(KeepSpecUtils.annotatedByFromProto(proto.getAnnotatedBy()));
+      }
       return this;
     }
 
@@ -217,7 +223,7 @@
         + '}';
   }
 
-  public static KeepMemberPattern fromMethodProto(MemberPatternMethod methodMember) {
+  public static KeepMemberPattern fromMethodMemberProto(MemberPatternMethod methodMember) {
     return builder().applyProto(methodMember).build();
   }
 
@@ -229,8 +235,8 @@
     if (!parametersPattern.isAny()) {
       builder.setParameterTypes(parametersPattern.buildProto());
     }
-    // TODO(b/343389186): Add annotated-by.
-    // TODO(b/343389186): Add access.
+    accessPattern.buildMethodProto(builder::setAccess);
+    KeepSpecUtils.buildAnnotatedByProto(annotatedByPattern, builder::setAnnotatedBy);
     return builder;
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPackagePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPackagePattern.java
index 16d9ef2..3483ff7 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPackagePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPackagePattern.java
@@ -45,7 +45,7 @@
 
   public static class Builder {
 
-    private KeepPackagePattern pattern;
+    private KeepPackagePattern pattern = KeepPackagePattern.any();
 
     public Builder applyProto(PackagePattern pkg) {
       if (pkg.hasExactPackageHack()) {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPreconditions.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPreconditions.java
index 246b20c..2cdf7d9 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPreconditions.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepPreconditions.java
@@ -3,12 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Condition;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
 
 public abstract class KeepPreconditions {
 
+  public static KeepPreconditions fromProto(List<Condition> protoList, BindingResolver resolver) {
+    return builder().applyProto(protoList, resolver).build();
+  }
+
   public abstract void forEach(Consumer<KeepCondition> fn);
 
   public static class Builder {
@@ -17,6 +23,14 @@
 
     private Builder() {}
 
+    public Builder applyProto(List<Condition> protoList, BindingResolver resolver) {
+      for (Condition condition : protoList) {
+        addCondition(KeepCondition.fromProto(condition, resolver));
+      }
+      assert !protoList.isEmpty() || build().isAlways();
+      return this;
+    }
+
     public Builder addCondition(KeepCondition condition) {
       preconditions.add(condition);
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepQualifiedClassNamePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepQualifiedClassNamePattern.java
index 4b1fcf7..94445bb 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepQualifiedClassNamePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepQualifiedClassNamePattern.java
@@ -50,7 +50,8 @@
   }
 
   public ClassNamePattern.Builder buildProto() {
-    return ClassNamePattern.newBuilder()
+    ClassNamePattern.Builder builder = ClassNamePattern.newBuilder();
+    return builder
         .setPackage(packagePattern.buildProto())
         .setUnqualifiedName(namePattern.buildProto());
   }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java
index b5f934b..5a76764 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java
@@ -4,8 +4,9 @@
 
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.AnnotatedByPattern;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.TypeDesc;
-import com.google.protobuf.MessageOrBuilder;
 import java.util.function.Consumer;
 
 public final class KeepSpecUtils {
@@ -15,4 +16,49 @@
   public static TypeDesc desc(String descriptor) {
     return TypeDesc.newBuilder().setDesc(descriptor).build();
   }
+
+  // Helper to resolve binding reference strings into symbols when parsing protos.
+  public static class BindingResolver {
+
+    // Builder is retained to resolve and does not escape this resolver.
+    private final KeepBindings.Builder builder;
+
+    // Bindings is the "build once" structure of the actual bindings.
+    private final KeepBindings bindings;
+
+    public BindingResolver(KeepBindings.Builder builder) {
+      this.builder = builder;
+      this.bindings = builder.build();
+    }
+
+    public KeepBindings getBindings() {
+      return bindings;
+    }
+
+    public KeepBindingReference mapReference(KeepSpecProtos.BindingReference reference) {
+      if (reference == null || reference.getName().isEmpty()) {
+        throw new KeepEdgeException("Invalid binding reference");
+      }
+      return builder.getBindingReferenceForUserBinding(reference.getName());
+    }
+  }
+
+  // Helpers to read/write the annotated-by pattern which does not have its own AST node.
+  public static void buildAnnotatedByProto(
+      OptionalPattern<KeepQualifiedClassNamePattern> pattern,
+      Consumer<AnnotatedByPattern.Builder> callback) {
+    // If the annotated-by pattern is absent then no restrictions are present, and we don't set it.
+    if (pattern.isPresent()) {
+      callback.accept(AnnotatedByPattern.newBuilder().setName(pattern.get().buildProto()));
+    }
+  }
+
+  public static OptionalPattern<KeepQualifiedClassNamePattern> annotatedByFromProto(
+      AnnotatedByPattern proto) {
+    if (!proto.hasName()) {
+      // No name implies any annotation (in contrast to no restrictions).
+      return OptionalPattern.of(KeepQualifiedClassNamePattern.any());
+    }
+    return OptionalPattern.of(KeepQualifiedClassNamePattern.fromProto(proto.getName()));
+  }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
index 0d7dc03..1a8321b 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
@@ -3,10 +3,22 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils.BindingResolver;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Target;
 import java.util.Objects;
 
 public class KeepTarget {
 
+  public Target.Builder buildProto() {
+    Target.Builder builder = Target.newBuilder();
+    constraints.buildProto(builder::setConstraints, builder::addConstraintAdditions);
+    return builder.setItem(item.buildProto());
+  }
+
+  public static KeepTarget fromProto(Target proto, BindingResolver resolver) {
+    return builder().applyProto(proto, resolver).build();
+  }
+
   public static class Builder {
 
     private KeepBindingReference item;
@@ -14,6 +26,16 @@
 
     private Builder() {}
 
+    public Builder applyProto(Target proto, BindingResolver resolver) {
+      setItemReference(resolver.mapReference(proto.getItem()));
+      assert constraints.isDefault();
+      constraints.fromProto(
+          proto.hasConstraints() ? proto.getConstraints() : null,
+          proto.getConstraintAdditionsList(),
+          this::setConstraints);
+      return this;
+    }
+
     public Builder setItemReference(KeepBindingReference itemReference) {
       this.item = itemReference;
       return this;
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTypePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTypePattern.java
index a123e61..15cfef7 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTypePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTypePattern.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.keepanno.ast;
 
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.TypePattern;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.Objects;
@@ -58,21 +57,6 @@
     throw new KeepEdgeException("Invalid type descriptor: " + typeDescriptor);
   }
 
-  public static KeepTypePattern fromProto(TypePattern typeProto) {
-    if (typeProto.hasPrimitive()) {
-      return KeepTypePattern.fromPrimitive(
-          KeepPrimitiveTypePattern.fromProto(typeProto.getPrimitive()));
-    }
-    if (typeProto.hasArray()) {
-      return KeepTypePattern.fromArray(KeepArrayTypePattern.fromProto(typeProto.getArray()));
-    }
-    if (typeProto.hasClazz()) {
-      return KeepTypePattern.fromClass(
-          KeepQualifiedClassNamePattern.fromProto(typeProto.getClazz()));
-    }
-    return KeepTypePattern.any();
-  }
-
   public abstract <T> T apply(
       Supplier<T> onAny,
       Function<KeepPrimitiveTypePattern, T> onPrimitive,
@@ -281,6 +265,25 @@
     }
   }
 
+  public static KeepTypePattern fromProto(TypePattern typeProto) {
+    if (typeProto.hasPrimitive()) {
+      return KeepTypePattern.fromPrimitive(
+          KeepPrimitiveTypePattern.fromProto(typeProto.getPrimitive()));
+    }
+    if (typeProto.hasArray()) {
+      return KeepTypePattern.fromArray(KeepArrayTypePattern.fromProto(typeProto.getArray()));
+    }
+    if (typeProto.hasClazz()) {
+      return KeepTypePattern.fromClass(
+          KeepQualifiedClassNamePattern.fromProto(typeProto.getClazz()));
+    }
+    if (typeProto.hasInstanceOf()) {
+      return KeepTypePattern.fromInstanceOf(
+          KeepInstanceOfPattern.fromProto(typeProto.getInstanceOf()));
+    }
+    return KeepTypePattern.any();
+  }
+
   public TypePattern.Builder buildProto() {
     TypePattern.Builder builder = TypePattern.newBuilder();
     match(
@@ -291,7 +294,14 @@
         array -> builder.setArray(array.buildProto()),
         clazz -> builder.setClazz(clazz.buildProto()),
         instanceOf -> {
-          throw new Unimplemented();
+          if (instanceOf.isAny()) {
+            // Note that an "any" instance-of pattern should match any class-type
+            // TODO(b/350647134): This should become evident when introducing a class-pattern.
+            //  When doing so, consider also if/how to match a general reference type.
+            builder.setClazz(KeepQualifiedClassNamePattern.any().buildProto());
+          } else {
+            instanceOf.buildProto(builder::setInstanceOf);
+          }
         });
     return builder;
   }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/ModifierPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/ModifierPattern.java
index 77ce8ad..1afe19e 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/ModifierPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/ModifierPattern.java
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import java.util.function.Consumer;
+
 /** Three-point valued matcher on an access modifier. */
 public class ModifierPattern {
 
@@ -69,4 +72,12 @@
   public int hashCode() {
     return System.identityHashCode(this);
   }
+
+  public void buildProto(Consumer<KeepSpecProtos.ModifierPattern.Builder> callback) {
+    if (isOnlyPositive()) {
+      callback.accept(KeepSpecProtos.ModifierPattern.newBuilder().setValue(true));
+    } else if (isOnlyNegative()) {
+      callback.accept(KeepSpecProtos.ModifierPattern.newBuilder().setValue(false));
+    }
+  }
 }
diff --git a/src/keepanno/proto/keepspec.proto b/src/keepanno/proto/keepspec.proto
index 451b137..fd52a93 100644
--- a/src/keepanno/proto/keepspec.proto
+++ b/src/keepanno/proto/keepspec.proto
@@ -83,7 +83,9 @@
 
 message Edge {
   MetaInfo meta_info = 1;
-  // TODO(b/343389186): Add content.
+  Bindings bindings = 2;
+  repeated Condition preconditions = 3;
+  repeated Target consequences = 4;
 }
 
 message Bindings {
@@ -99,6 +101,55 @@
   string name = 1;
 }
 
+message Condition {
+  BindingReference item = 1;
+}
+
+message Target {
+  BindingReference item = 1;
+  optional Constraints constraints = 2;
+  repeated Constraint constraint_additions = 3;
+}
+
+message Constraints {
+  repeated Constraint constraints = 1;
+}
+
+enum ConstraintElement {
+  CONSTRAINT_UNSPECIFIED = 0;
+  CONSTRAINT_LOOKUP = 1;
+  CONSTRAINT_NAME = 2;
+  CONSTRAINT_VISIBILITY_RELAX = 3;
+  CONSTRAINT_VISIBILITY_RESTRICT = 4;
+  CONSTRAINT_NEVER_INLINE = 5;
+  CONSTRAINT_CLASS_INSTANTIATE = 6;
+  CONSTRAINT_CLASS_OPEN_HIERARCHY = 7;
+  CONSTRAINT_METHOD_INVOKE = 8;
+  CONSTRAINT_METHOD_REPLACE = 9;
+  CONSTRAINT_FIELD_GET = 10;
+  CONSTRAINT_FIELD_SET = 11;
+  CONSTRAINT_FIELD_REPLACE = 12;
+  CONSTRAINT_GENERIC_SIGNATURE = 13;
+}
+
+message AnnotationPattern {
+  optional AnnotationRetention retention = 1;
+  optional ClassNamePattern name = 2;
+}
+
+enum AnnotationRetention {
+  RETENTION_UNSPECIFIED = 0;
+  RETENTION_RUNTIME = 1;
+  RETENTION_CLASS = 2;
+}
+
+message Constraint {
+  oneof constraint_oneof {
+    ConstraintElement element = 1;
+    AnnotationPattern annotation = 2;
+  }
+}
+
 message ItemPattern {
   oneof item_oneof {
     ClassItemPattern class_item = 1;
@@ -108,8 +159,13 @@
 
 message ClassItemPattern {
   optional ClassNamePattern class_name = 1;
-  // TODO(b/343389186): Add instance-of.
-  // TODO(b/343389186): Add annotated-by.
+  optional InstanceOfPattern instance_of = 2;
+  optional AnnotatedByPattern annotated_by = 3;
+}
+
+message InstanceOfPattern {
+  optional bool inclusive = 1;
+  optional ClassNamePattern class_name = 2;
 }
 
 message ClassNamePattern {
@@ -151,6 +207,10 @@
   optional StringPattern name = 1;
 }
 
+message AnnotatedByPattern {
+  optional ClassNamePattern name = 1;
+}
+
 message MemberItemPattern {
   BindingReference class_reference = 1;
   optional MemberPattern member_pattern = 2;
@@ -164,20 +224,64 @@
   }
 }
 
+enum AccessVisibility {
+  ACCESS_UNSPECIFIED = 0;
+  ACCESS_PUBLIC = 1;
+  ACCESS_PROTECTED = 2;
+  ACCESS_PACKAGE_PRIVATE = 3;
+  ACCESS_PRIVATE = 4;
+}
+
+message AccessVisibilitySet {
+  repeated AccessVisibility access_visibility = 1;
+}
+
+// Placeholder for an optional boolean modifier.
+// The optional value is encoded by it not being present at the reference point.
+message ModifierPattern {
+  bool value = 1;
+}
+
+message MemberAccessGeneral {
+  optional AccessVisibilitySet access_visibility = 1;
+  optional ModifierPattern static_pattern = 2;
+  optional ModifierPattern final_pattern = 3;
+  optional ModifierPattern synthetic_pattern = 4;
+}
+
+message MemberAccessField {
+  optional MemberAccessGeneral general_access = 1;
+  optional ModifierPattern volatile_pattern = 2;
+  optional ModifierPattern transient_pattern = 3;
+}
+
+message MemberAccessMethod {
+  optional MemberAccessGeneral general_access = 1;
+  optional ModifierPattern synchronized_pattern = 2;
+  optional ModifierPattern bridge_pattern = 3;
+  optional ModifierPattern native_pattern = 4;
+  optional ModifierPattern abstract_pattern = 5;
+  optional ModifierPattern strict_fp_pattern = 6;
+}
+
 message MemberPatternGeneral {
-  // TODO(b/343389186): Add content.
+  optional MemberAccessGeneral access = 1;
+  optional AnnotatedByPattern annotated_by = 2;
 }
 
 message MemberPatternField {
-  // TODO(b/343389186): Add content.
+  optional MemberAccessField access = 1;
+  optional AnnotatedByPattern annotated_by = 2;
+  optional StringPattern name = 3;
+  optional TypePattern field_type = 4;
 }
 
 message MemberPatternMethod {
-  optional StringPattern name = 1;
-  optional MethodReturnTypePattern return_type = 2;
-  optional MethodParameterTypesPattern parameter_types = 3;
-  // TODO(b/343389186): Add annotated-by.
-  // TODO(b/343389186): Add access.
+  optional MemberAccessMethod access = 1;
+  optional AnnotatedByPattern annotated_by = 2;
+  optional StringPattern name = 3;
+  optional MethodReturnTypePattern return_type = 4;
+  optional MethodParameterTypesPattern parameter_types = 5;
 }
 
 message MethodReturnTypePattern {
@@ -202,7 +306,7 @@
     TypePatternPrimitive primitive = 1;
     TypePatternArray array = 2;
     ClassNamePattern clazz = 3;
-    // TODO(b/343389186): Add instance-of.
+    InstanceOfPattern instance_of = 4;
   }
 }
 
@@ -223,4 +327,3 @@
   optional uint32 dimensions = 1;
   optional TypePattern base_type = 2;
 }
-
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 36f1ff3..3bd0ac5 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -139,8 +139,6 @@
     private boolean enableMissingLibraryApiModeling = false;
     private boolean enableExperimentalKeepAnnotations =
         System.getProperty("com.android.tools.r8.enableKeepAnnotations") != null;
-    private boolean enableExperimentalVersionedKeepEdgeAnnotations =
-        System.getProperty("com.android.tools.r8.enableVersionedKeepEdgeAnnotations") != null;
     public boolean enableStartupLayoutOptimization = true;
     private SemanticVersion fakeCompilerVersion = null;
     private AndroidResourceProvider androidResourceProvider = null;
@@ -522,12 +520,6 @@
       return self();
     }
 
-    @Deprecated
-    public Builder setEnableExperimentalExtractedKeepAnnotations(boolean enable) {
-      this.enableExperimentalVersionedKeepEdgeAnnotations = enable;
-      return self();
-    }
-
     @Override
     protected InternalProgramOutputPathConsumer createProgramOutputConsumer(
         Path path,
@@ -845,20 +837,15 @@
     }
 
     private void extractKeepAnnotationRules(ProguardConfigurationParser parser) {
-      if (!enableExperimentalKeepAnnotations && !enableExperimentalVersionedKeepEdgeAnnotations) {
+      if (!enableExperimentalKeepAnnotations) {
         return;
       }
-      assert enableExperimentalKeepAnnotations != enableExperimentalVersionedKeepEdgeAnnotations;
       try {
         for (ProgramResourceProvider provider : getAppBuilder().getProgramResourceProviders()) {
           for (ProgramResource resource : provider.getProgramResources()) {
             if (resource.getKind() == Kind.CF) {
-              List<KeepDeclaration> declarations;
-              if (!enableExperimentalKeepAnnotations) {
-                declarations = KeepEdgeReader.readExtractedKeepEdges(resource.getBytes());
-              } else {
-                declarations = KeepEdgeReader.readKeepEdges(resource.getBytes());
-              }
+              List<KeepDeclaration> declarations =
+                  KeepEdgeReader.readKeepEdges(resource.getBytes());
               if (!declarations.isEmpty()) {
                 KeepRuleExtractor extractor =
                     new KeepRuleExtractor(
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 57b427e..a515a46 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -458,7 +458,7 @@
     public boolean shouldReadKeepAnnotations() {
       // Only compilers configured to read annotations should process them.
       // In all other instances (D8, relocater, etc.) they must be pass-through.
-      return application.options.testing.isKeepAnnotationsEnabled()
+      return application.options.testing.enableEmbeddedKeepAnnotations
           && classKind == ClassKind.PROGRAM;
     }
 
@@ -470,7 +470,6 @@
             desc,
             visible,
             application.options.testing.enableEmbeddedKeepAnnotations,
-            application.options.testing.enableExtractedKeepAnnotations,
             className,
             ClassParsingContext.fromName(className).annotation(desc),
             application::addKeepDeclaration);
@@ -684,7 +683,6 @@
             desc,
             visible,
             parent.application.options.testing.enableEmbeddedKeepAnnotations,
-            parent.application.options.testing.enableExtractedKeepAnnotations,
             className,
             name,
             fieldTypeDescriptor,
@@ -852,7 +850,6 @@
             desc,
             visible,
             parent.application.options.testing.enableEmbeddedKeepAnnotations,
-            parent.application.options.testing.enableExtractedKeepAnnotations,
             className,
             name,
             methodDescriptor,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
index d3c57fc..984e829 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
@@ -241,7 +241,7 @@
     // type.
     if (castType.isClassType()
         && castType.isAlwaysNull(appViewWithLiveness)
-        && !outValue.hasDebugUsers()
+        && !outValue.hasLocalInfo()
         && !appView.getSyntheticItems().isFinalized()) {
       // Replace all usages of the out-value by null.
       it.previous();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
index 188c5ef..bcb57ce 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
@@ -109,7 +109,8 @@
               instanceOf.type().toTypeElement(appView, valueType.nullability());
           if (instanceOfType.isClassType(t -> t.getClassType().isNotIdenticalTo(objectType))
               && !instanceOfType.lessThanOrEqual(valueType, appView)
-              && !valueType.lessThanOrEqual(instanceOfType, appView)) {
+              && !valueType.lessThanOrEqual(instanceOfType, appView)
+              && !valueType.isBasedOnMissingClass(appView.withClassHierarchy())) {
             instructionIterator.replaceCurrentInstructionWithConstFalse(code);
             didReplaceInstructions = true;
           }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index abee4a2..d4fd18a 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -154,6 +154,7 @@
 import com.android.tools.r8.shaking.RootSetUtils.RootSetBuilder;
 import com.android.tools.r8.shaking.ScopedDexMethodSet.AddMethodIfMoreVisibleResult;
 import com.android.tools.r8.shaking.rules.ApplicableRulesEvaluator;
+import com.android.tools.r8.shaking.rules.KeepAnnotationFakeProguardRule;
 import com.android.tools.r8.shaking.rules.KeepAnnotationMatcher;
 import com.android.tools.r8.synthesis.SyntheticItems.SynthesizingContextOracle;
 import com.android.tools.r8.utils.Action;
@@ -678,9 +679,6 @@
   }
 
   private void addEffectivelyLiveOriginalMethod(ProgramMethod method) {
-    if (!options.testing.isKeepAnnotationsEnabled()) {
-      return;
-    }
     if (method.getDefinition().hasPendingInlineFrame()) {
       traceMethodPosition(method.getDefinition().getPendingInlineFrameAsPosition(), method);
     } else if (!method.getDefinition().isD8R8Synthesized()) {
@@ -1056,7 +1054,8 @@
         if (forceProguardCompatibility) {
           Joiner joiner = KeepMethodInfo.newEmptyJoiner();
           for (ProguardKeepRuleBase rule : rules) {
-            if (!rule.getType().equals(ProguardKeepRuleType.KEEP_CLASS_MEMBERS)) {
+            if (!(rule instanceof KeepAnnotationFakeProguardRule)
+                && !rule.getType().equals(ProguardKeepRuleType.KEEP_CLASS_MEMBERS)) {
               joiner.addRule(rule);
             }
           }
@@ -1677,10 +1676,6 @@
   }
 
   void traceMethodPosition(com.android.tools.r8.ir.code.Position position, ProgramMethod context) {
-    if (!options.testing.isKeepAnnotationsEnabled()) {
-      // Currently inlining is only intended for the evaluation of keep annotation edges.
-      return;
-    }
     while (position.hasCallerPosition()) {
       // Any inner position should not be non-synthetic user methods.
       assert !position.isD8R8Synthesized();
@@ -3311,9 +3306,6 @@
   }
 
   private void addEffectivelyLiveOriginalField(ProgramField field) {
-    if (!options.testing.isKeepAnnotationsEnabled()) {
-      return;
-    }
     if (field.getDefinition().hasOriginalFieldWitness()) {
       markEffectivelyLiveOriginalReference(field.getDefinition().getOriginalFieldWitness());
     } else {
@@ -3560,7 +3552,6 @@
   }
 
   public boolean isOriginalReferenceEffectivelyLive(DexReference reference) {
-    assert options.testing.isKeepAnnotationsEnabled();
     // The effectively-live original set contains types, fields and methods witnessed by
     // instructions, such as method inlining positions.
     return effectivelyLiveOriginalReferences.contains(reference);
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepAnnotationCollectionInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepAnnotationCollectionInfo.java
index cd7bf16..d1e1d5b 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepAnnotationCollectionInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepAnnotationCollectionInfo.java
@@ -294,14 +294,17 @@
         // Our specific types are "bottom" so this is less than.
         return true;
       }
-      if (other.specificTypeInfo == null) {
-        // Other specific types are "bottom" and this is not bottom, so it is not less than.
-        return false;
-      }
-      // Check that each specific type is less than the content of the type in other.
+      // Check that each specific type is less than the content of the type in other or its
+      // any-type when not present.
       for (DexType type : specificTypeInfo.keySet()) {
-        KeepAnnotationInfo otherInfo = other.specificTypeInfo.get(type);
-        if (otherInfo == null || !specificTypeInfo.get(type).isLessThanOrEqualTo(otherInfo)) {
+        KeepAnnotationInfo otherInfo = null;
+        if (other.specificTypeInfo != null) {
+          otherInfo = other.specificTypeInfo.get(type);
+        }
+        if (otherInfo == null) {
+          otherInfo = other.anyTypeInfo;
+        }
+        if (!specificTypeInfo.get(type).isLessThanOrEqualTo(otherInfo)) {
           return false;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java b/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java
index 1dfda01..72f1164 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java
@@ -45,7 +45,8 @@
       throw new ResourceException(getOrigin(), "Unknown keepspec version " + spec.getVersion());
     }
     for (Declaration declaration : spec.getDeclarationsList()) {
-      KeepDeclaration parsedDeclaration = KeepDeclaration.fromProto(declaration, version);
+      KeepDeclaration parsedDeclaration =
+          KeepDeclaration.fromDeclarationProto(declaration, version);
       if (parsedDeclaration == null) {
         throw new ResourceException(getOrigin(), "Unable to parse declaration " + declaration);
       } else {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParserOptions.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParserOptions.java
index a584eb4..acdd37c 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParserOptions.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParserOptions.java
@@ -72,10 +72,9 @@
               "com.android.tools.r8.experimental.enablewhyareyounotinlining", false);
       enableTestingOptions =
           parseSystemPropertyOrDefault("com.android.tools.r8.allowTestProguardOptions", false);
-      // TODO(b/323136645): This should default to false.
       forceEnableEmptyMemberRulesToDefaultInitRuleConversion =
           parseSystemPropertyOrDefault(
-              "com.android.tools.r8.enableEmptyMemberRulesToDefaultInitRuleConversion", true);
+              "com.android.tools.r8.enableEmptyMemberRulesToDefaultInitRuleConversion", false);
       return this;
     }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleType.java b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleType.java
index 2018cbf..44e836e 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleType.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleType.java
@@ -9,7 +9,8 @@
   KEEP,
   KEEP_CLASS_MEMBERS,
   KEEP_CLASSES_WITH_MEMBERS,
-  CONDITIONAL;
+  CONDITIONAL,
+  KEEPSPEC;
 
   @Override
   public String toString() {
@@ -22,6 +23,8 @@
         return "keepclasseswithmembers";
       case CONDITIONAL:
         return "if";
+      case KEEPSPEC:
+        return "keepspec";
       default:
         throw new Unreachable("Unknown ProguardKeepRuleType.");
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 3d5324b..e0170ef 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -282,6 +282,8 @@
             break;
           case CONDITIONAL:
             throw new Unreachable("-if rule will be evaluated separately, not here.");
+          case KEEPSPEC:
+            throw new Unreachable("keepspec rules are evaluated separately, not here.");
         }
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationFakeProguardRule.java b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationFakeProguardRule.java
index 2e28fcb..73b5fee 100644
--- a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationFakeProguardRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationFakeProguardRule.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.shaking.ProguardClassType;
 import com.android.tools.r8.shaking.ProguardKeepRuleBase;
+import com.android.tools.r8.shaking.ProguardKeepRuleType;
 
 // TODO(b/323816623): Make an interface to use in the keep-reason tracking.
 public class KeepAnnotationFakeProguardRule extends ProguardKeepRuleBase {
@@ -28,7 +29,7 @@
         null,
         false,
         null,
-        null,
+        ProguardKeepRuleType.KEEPSPEC,
         null);
   }
 }
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 ef49e3a..14efa1d 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2217,14 +2217,10 @@
 
   public static class TestingOptions {
 
-    public boolean enableExtractedKeepAnnotations = false;
-    public boolean enableEmbeddedKeepAnnotations = false;
+    public boolean enableEmbeddedKeepAnnotations =
+        System.getProperty("com.android.tools.r8.enableKeepAnnotations") != null;
     public boolean reverseClassSortingForDeterminism = false;
 
-    public boolean isKeepAnnotationsEnabled() {
-      return enableExtractedKeepAnnotations || enableEmbeddedKeepAnnotations;
-    }
-
     public boolean enableNumberUnboxer = false;
     public boolean printNumberUnboxed = false;
     public boolean roundtripThroughLir = false;
diff --git a/src/main/keep.txt b/src/main/keep.txt
index 83f70b1..ddb667f 100644
--- a/src/main/keep.txt
+++ b/src/main/keep.txt
@@ -29,3 +29,7 @@
 
 # Test in this class is using the class name to fing the original .java file.
 -keep class com.android.tools.r8.ir.desugar.varhandle.VarHandleDesugaringMethods
+
+# The protobuf library uses reflection for toString printing.
+# Note that this is keeping the relocated package location.
+-keep class com.android.tools.r8.relocated.keepanno.proto.** { *; }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java b/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
index 1bd723a..bb999d8 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
@@ -333,7 +333,8 @@
 
   @Test
   public void testWithMembersStarRuleFullR8() throws Exception {
-    testWithMembersStarRule(testForR8(parameters.getBackend()));
+    testWithMembersStarRule(
+        testForR8(parameters.getBackend()).allowUnusedProguardConfigurationRules());
   }
 
   // Tests for "-keepclassmembernames" and *no* minification.
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index f39df8f..516cccd 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.keepanno;
 
-import static com.android.tools.r8.utils.CfUtils.extractClassDescriptor;
 
 import com.android.tools.r8.ExternalR8TestBuilder;
 import com.android.tools.r8.ProguardTestBuilder;
@@ -18,18 +17,14 @@
 import com.android.tools.r8.TestShrinkerBuilder;
 import com.android.tools.r8.ThrowableConsumer;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.keepanno.KeepAnnoParameters.KeepAnnoConfig;
 import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
-import com.android.tools.r8.keepanno.asm.KeepEdgeWriter;
 import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.keepanno.ast.KeepSpecVersion;
+import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractorOptions;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.KeepSpec;
-import com.android.tools.r8.keepanno.utils.Unimplemented;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.InternalOptions;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -38,8 +33,6 @@
 import java.util.List;
 import java.util.function.Consumer;
 import org.junit.rules.TemporaryFolder;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Opcodes;
 
 public abstract class KeepAnnoTestBuilder {
 
@@ -197,23 +190,9 @@
               .enableExperimentalKeepAnnotations()
               .setMinApi(parameters());
 
-      if (isExtractRules()) {
-        // TODO(b/323816623): Replace the internal rule extraction by extraction in this builder.
-        builder.getBuilder().setEnableExperimentalKeepAnnotations(true);
-        builder.getBuilder().setEnableExperimentalExtractedKeepAnnotations(false);
-        return;
-      }
-
       // TODO(b/323816623): Replace the testing flag by the API call.
-      // This enables native interpretation of all keep annotations.
-      builder.addOptionsModification(
-          o -> {
-            o.testing.enableExtractedKeepAnnotations = isNormalizeEdges();
-            o.testing.enableEmbeddedKeepAnnotations = !isNormalizeEdges();
-          });
-      // This disables all reading of annotations in the command reader.
       builder.getBuilder().setEnableExperimentalKeepAnnotations(false);
-      builder.getBuilder().setEnableExperimentalExtractedKeepAnnotations(false);
+      builder.addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
     }
 
     private boolean isExtractRules() {
@@ -224,6 +203,10 @@
       return config == KeepAnnoConfig.R8_NORMALIZED;
     }
 
+    private boolean isDirect() {
+      return config == KeepAnnoConfig.R8_DIRECT;
+    }
+
     @Override
     public KeepAnnoTestBuilder allowUnusedProguardConfigurationRules() {
       if (isExtractRules()) {
@@ -280,54 +263,29 @@
 
     private void extractAndAdd(byte[] classFileData) {
       builder.addProgramClassFileData(classFileData);
+      if (isExtractRules()) {
+        List<KeepDeclaration> declarations = KeepEdgeReader.readKeepEdges(classFileData);
+        if (!declarations.isEmpty()) {
+          KeepRuleExtractor extractor = new KeepRuleExtractor(builder::addKeepRules);
+          declarations.forEach(extractor::extract);
+        }
+        return;
+      }
       if (isNormalizeEdges()) {
         List<KeepDeclaration> declarations = KeepEdgeReader.readKeepEdges(classFileData);
         if (!declarations.isEmpty()) {
-          List<KeepDeclaration> legacyExtract = new ArrayList<>();
           KeepSpec.Builder keepSpecBuilder = KeepSpec.newBuilder();
           keepSpecBuilder.setVersion(KeepSpecVersion.getCurrent().buildProto());
           for (KeepDeclaration declaration : declarations) {
-            try {
-              keepSpecBuilder.addDeclarations(declaration.buildDeclarationProto());
-            } catch (Unimplemented e) {
-              legacyExtract.add(declaration);
-            }
+            keepSpecBuilder.addDeclarations(declaration.buildDeclarationProto());
           }
           builder
               .getBuilder()
               .addKeepSpecificationData(keepSpecBuilder.build().toByteArray(), Origin.unknown());
-          if (legacyExtract.isEmpty()) {
-            // TODO(b/343389186): Finish the proto encoding and remove the below extraction.
-            return;
-          }
-          String binaryName =
-              DescriptorUtils.getBinaryNameFromDescriptor(extractClassDescriptor(classFileData));
-          String synthesizingTarget = binaryName + "$$ExtractedKeepEdges";
-          ClassWriter classWriter = new ClassWriter(InternalOptions.ASM_VERSION);
-          classWriter.visit(
-              Opcodes.V1_8,
-              ClassAccessFlags.createPublicFinalSynthetic().getAsCfAccessFlags(),
-              synthesizingTarget,
-              null,
-              "java/lang/Object",
-              null);
-          KeepEdgeWriter.writeExtractedEdges(
-              legacyExtract,
-              (descriptor, visible) ->
-                  KeepAnnoTestUtils.wrap(classWriter.visitAnnotation(descriptor, visible)));
-          classWriter.visitEnd();
-          builder
-              .getBuilder()
-              .addClassProgramData(
-                  classWriter.toByteArray(),
-                  new Origin(Origin.root()) {
-                    @Override
-                    public String part() {
-                      return "edge-extraction";
-                    }
-                  });
         }
+        return;
       }
+      assert isDirect();
     }
 
     @Override
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
index 85809df..1293e79 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -34,11 +37,14 @@
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
-        .assertSuccessWithOutput(EXPECTED);
+        .assertSuccessWithOutput(EXPECTED)
+        .applyIf(
+            parameters.isShrinker(),
+            r -> r.inspect(inspector -> assertThat(inspector.clazz(Unrelated.class), isAbsent())));
   }
 
   public List<Class<?>> getInputClasses() {
-    return ImmutableList.of(TestClass.class, Base.class, Sub.class, A.class);
+    return ImmutableList.of(TestClass.class, Base.class, Sub.class, A.class, Unrelated.class);
   }
 
   static class Base {
@@ -53,6 +59,12 @@
     }
   }
 
+  static class Unrelated {
+    static void hiddenMethod() {
+      System.out.println("on Unrelated");
+    }
+  }
+
   static class A {
 
     @UsesReflection({
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
index 8c96fe1..f85dcd7 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
@@ -41,19 +41,6 @@
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
-        .inspectOutputConfig(
-            rules -> {
-              if (parameters.isNativeR8()) {
-                // TODO(b/323816623): Once a final distribution format is defined for normalized
-                //  edges, that format should likely be the bases of the annotation printing too.
-                assertThat(rules, containsString("context=" + descriptor(A.class) + "foo()V"));
-                assertThat(
-                    rules, containsString("description=\"Keep the\\nstring-valued fields\""));
-              } else {
-                assertThat(rules, containsString("context: " + descriptor(A.class) + "foo()V"));
-                assertThat(rules, containsString("description: Keep the\\nstring-valued fields"));
-              }
-            })
         .run(TestClass.class)
         .assertSuccessWithOutput(EXPECTED)
         .applyIf(parameters.isShrinker(), r -> r.inspect(this::checkOutput));
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
index e92c4d8..e6d0cf9 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
@@ -80,8 +80,6 @@
   static final ClassReference USED_BY_NATIVE = annoClass("UsedByNative");
   static final ClassReference CHECK_REMOVED = annoClass("CheckRemoved");
   static final ClassReference CHECK_OPTIMIZED_OUT = annoClass("CheckOptimizedOut");
-  static final ClassReference EXTRACTED_KEEP_ANNOTATIONS = annoClass("ExtractedKeepAnnotations");
-  static final ClassReference EXTRACTED_KEEP_ANNOTATION = annoClass("ExtractedKeepAnnotation");
   static final ClassReference KEEP_EDGE = annoClass("KeepEdge");
   static final ClassReference KEEP_BINDING = annoClass("KeepBinding");
   static final ClassReference KEEP_TARGET = annoClass("KeepTarget");
@@ -1680,7 +1678,6 @@
       withIndent(
           () -> {
             // Root annotations.
-            generateExtractedKeepAnnotationsConstants();
             generateKeepEdgeConstants();
             generateKeepForApiConstants();
             generateUsesReflectionConstants();
@@ -1719,49 +1716,6 @@
       println("public static final String DESCRIPTOR = " + quote(desc) + ";");
     }
 
-    private void generateExtractedKeepAnnotationsConstants() {
-      println("public static final class ExtractedAnnotations {");
-      withIndent(
-          () -> {
-            generateAnnotationConstants(EXTRACTED_KEEP_ANNOTATIONS);
-            new GroupMember("value")
-                .setDocTitle("Extracted normalized keep edges.")
-                .requiredArrayValue(KEEP_EDGE)
-                .generateConstants(this);
-          });
-      println("}");
-      println();
-      println("public static final class ExtractedAnnotation {");
-      withIndent(
-          () -> {
-            generateAnnotationConstants(EXTRACTED_KEEP_ANNOTATION);
-            new GroupMember("version")
-                .setDocTitle("Extraction version used to generate this keep annotation.")
-                .requiredStringValue()
-                .generateConstants(this);
-            new GroupMember("context")
-                .setDocTitle("Extraction context from which this keep annotation is generated.")
-                .requiredStringValue()
-                .generateConstants(this);
-            new Group("keep-annotation")
-                .addMember(
-                    new GroupMember("edge")
-                        .setDocTitle("Extracted normalized keep edge.")
-                        .requiredValue(KEEP_EDGE))
-                .addMember(
-                    new GroupMember("checkRemoved")
-                        .setDocTitle("Extracted check removed.")
-                        .defaultBooleanValue(false))
-                .addMember(
-                    new GroupMember("checkOptimizedOut")
-                        .setDocTitle("Extracted check optimized out.")
-                        .defaultBooleanValue(false))
-                .generateConstants(this);
-          });
-      println("}");
-      println();
-    }
-
     List<Group> getKeepEdgeGroups() {
       return ImmutableList.of(
           createDescriptionGroup(),
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
index ab71079..96aa8fd 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
@@ -62,7 +62,7 @@
               ClassSubject classSubject = inspector.clazz(StaticallyReferenced.class);
               assertThat(classSubject, isPresent());
               assertEquals(0, classSubject.allFields().size());
-              assertEquals(1, classSubject.allMethods().size());
+              assertEquals(0, classSubject.allMethods().size());
             });
   }
 
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index 9d35920..4d7338d 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -782,7 +782,7 @@
   }
 
   public T enableExperimentalKeepAnnotations() {
-    builder.setEnableExperimentalKeepAnnotations(true);
+    addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = true);
     try {
       builder.addClasspathFiles(KeepAnnoTestUtils.getKeepAnnoLib(getState().getTempFolder()));
       return self();
diff --git a/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java b/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
index 93384e8..8fba6b2 100644
--- a/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/keepanno/KeepAnnoTestUtils.java
@@ -11,12 +11,10 @@
 import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
-import com.android.tools.r8.keepanno.asm.KeepEdgeWriter.AnnotationVisitorInterface;
 import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractorOptions;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -26,7 +24,6 @@
 import java.util.List;
 import java.util.stream.Stream;
 import org.junit.rules.TemporaryFolder;
-import org.objectweb.asm.AnnotationVisitor;
 
 public class KeepAnnoTestUtils {
 
@@ -101,47 +98,4 @@
     }
     return rules;
   }
-
-  public static AnnotationVisitorInterface wrap(AnnotationVisitor visitor) {
-    return visitor == null ? null : new WrappedAnnotationVisitor(visitor);
-  }
-
-  private static class WrappedAnnotationVisitor implements AnnotationVisitorInterface {
-
-    private final AnnotationVisitor visitor;
-
-    private WrappedAnnotationVisitor(AnnotationVisitor visitor) {
-      this.visitor = visitor;
-    }
-
-    @Override
-    public int version() {
-      return InternalOptions.ASM_VERSION;
-    }
-
-    @Override
-    public void visit(String name, Object value) {
-      visitor.visit(name, value);
-    }
-
-    @Override
-    public void visitEnum(String name, String descriptor, String value) {
-      visitor.visitEnum(name, descriptor, value);
-    }
-
-    @Override
-    public AnnotationVisitorInterface visitAnnotation(String name, String descriptor) {
-      return wrap(visitor.visitAnnotation(name, descriptor));
-    }
-
-    @Override
-    public AnnotationVisitorInterface visitArray(String name) {
-      return wrap(visitor.visitArray(name));
-    }
-
-    @Override
-    public void visitEnd() {
-      visitor.visitEnd();
-    }
-  }
 }
diff --git a/tools/apk_masseur.py b/tools/apk_masseur.py
index 487cb7c..4d92044 100755
--- a/tools/apk_masseur.py
+++ b/tools/apk_masseur.py
@@ -7,6 +7,7 @@
 import optparse
 import os
 import shutil
+import subprocess
 import sys
 
 import apk_utils
@@ -60,11 +61,12 @@
                       help='Sign the apk before aligning',
                       default=False,
                       action='store_true')
-    (options, args) = parser.parse_args()
-    if len(args) != 1:
-        parser.error('Expected <apk> argument, got: ' + ' '.join(args))
-    apk = args[0]
-    return (options, apk)
+    (options, apks) = parser.parse_args()
+    if len(apks) == 0:
+        parser.error('Expected one or more apk arguments, got none.')
+    if len(apks) > 1 and options.out:
+        parser.error('Cannot process multiple apks with --out')
+    return (options, apks)
 
 
 def is_archive(file):
@@ -82,8 +84,13 @@
             processed_apk)
 
     if not processed_out:
-        utils.Print('Using original dex as is', quiet=quiet)
-        return processed_apk
+        if has_wrong_compression(apk, compress_dex):
+            processed_out = os.path.join(temp, 'extracted')
+            subprocess.check_call(
+                ['unzip', apk, '-d', processed_out, 'classes*.dex'])
+        else:
+            utils.Print('Using original dex as is', quiet=quiet)
+            return processed_apk
 
     utils.Print('Repacking APK with dex files from {}'.format(processed_out),
                 quiet=quiet)
@@ -148,6 +155,16 @@
     return apk_utils.align(signed_apk, aligned_apk)
 
 
+def has_wrong_compression(apk, compress_dex):
+    cmd = ['zipinfo', apk, 'classes*.dex']
+    stdout = subprocess.check_output(cmd).decode('utf-8').strip()
+    expected = ' defN ' if compress_dex else ' stor '
+    for line in stdout.splitlines():
+        if not expected in line:
+            return True
+    return False
+
+
 def masseur(apk,
             clear_profile=False,
             dex=None,
@@ -167,7 +184,7 @@
         keystore = apk_utils.default_keystore()
     with utils.TempDir() as temp:
         processed_apk = None
-        if dex or clear_profile:
+        if dex or clear_profile or has_wrong_compression(apk, compress_dex):
             processed_apk = repack(apk, clear_profile, dex,
                                    desugared_library_dex, compress_dex,
                                    resources, temp, quiet, logging)
@@ -208,8 +225,13 @@
 
 
 def main():
-    (options, apk) = parse_options()
-    masseur(apk, **vars(options))
+    (options, apks) = parse_options()
+    if len(apks) == 1:
+        masseur(apks[0], **vars(options))
+    else:
+        for apk in apks:
+            print(f'Processing {apk}')
+            masseur(apk, **vars(options))
     return 0
 
 
diff --git a/tools/r8_release.py b/tools/r8_release.py
index 6cebc5e..6090377 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -17,7 +17,7 @@
 
 import utils
 
-R8_DEV_BRANCH = '8.6'
+R8_DEV_BRANCH = '8.7'
 R8_VERSION_FILE = os.path.join('src', 'main', 'java', 'com', 'android', 'tools',
                                'r8', 'Version.java')
 THIS_FILE_RELATIVE = os.path.join('tools', 'r8_release.py')
@@ -29,7 +29,6 @@
 
 GITHUB_DESUGAR_JDK_LIBS = 'https://github.com/google/desugar_jdk_libs'
 
-
 def install_gerrit_change_id_hook(checkout_dir):
     with utils.ChangedWorkingDirectory(checkout_dir):
         # Fancy way of getting the string ".git".
@@ -353,12 +352,14 @@
         subprocess.check_call('g4 open %s' % file, shell=True)
 
 
-def g4_change(version):
+def g4_change(version, commit_info):
     message = f'Update R8 to {version}'
     if version == 'main':
         message = f'DO NOT SUBMIT: {message}'
+    if commit_info:
+        message += f'\n\n{commit_info}'
     return subprocess.check_output(
-        f'g4 change --desc "{message}\n"',
+        f"g4 change --desc '{message}\n'",
         shell=True).decode('utf-8')
 
 
@@ -406,6 +407,36 @@
                                    stderr=subprocess.STDOUT).decode('utf-8')
 
 
+def find_r8_version_hash(branch, version):
+    if not branch.startswith('origin/'):
+        print('Expected branch to start with origin/')
+        return 1
+    output = subprocess.check_output([
+        'git',
+        'log',
+        '--pretty=format:%H\t%s',
+        '--grep',
+        '^Version [[:digit:]]\+.[[:digit:]]\+.[[:digit:]]\+\(\|-dev\)$',
+        branch]).decode('utf-8')
+    for l in output.split('\n'):
+        (hash, subject) = l.split('\t')
+        m = re.search('Version (.+)', subject)
+        if not m:
+            print('Unable to find a version for line: %s' % l)
+            continue
+        if (m.group(1) == version):
+            return hash
+    print(f'ERROR: Did not find commit for {version} on branch {branch}')
+
+
+def find_2nd(string, substring):
+    return string.find(substring, string.find(substring) + 1)
+
+
+def branch_from_version(version):
+    return version[0:find_2nd(version, '.')]
+
+
 def prepare_google3(args):
     assert args.version
     # Check if an existing client exists.
@@ -421,6 +452,7 @@
             ['p4', 'g4d', '-f', args.p4_client]).decode('utf-8').rstrip()
         third_party_r8 = os.path.join(google3_base, 'third_party', 'java', 'r8')
         today = datetime.date.today()
+        commit_info = 'No info on changes merged.'
         with utils.ChangedWorkingDirectory(third_party_r8):
             # download files
             g4_open('full.jar')
@@ -456,13 +488,25 @@
                 metadata_path = os.path.join(third_party_r8, 'METADATA')
                 match_count = 0
                 match_count_expected = 10
-                version_match_regexp = r'[1-9]\.[0-9]{1,2}\.[0-9]{1,3}-dev'
+                match_value = None
+                version_match_regexp = r'([1-9]\.[0-9]{1,2}\.[0-9]{1,3}-dev)'
                 for line in open(metadata_path, 'r'):
                     result = re.search(version_match_regexp, line)
                     if result:
                         match_count = match_count + 1
+                        if not match_value:
+                            match_value = result.group(1)
+                        else:
+                            if match_value != result.group(1):
+                                print(f"""ERROR:
+                                Multiple -dev release strings ({match_value} and
+                                {result.group(0)}) found in METADATA. Please update
+                                {metadata_path} manually and run again with options
+                                --google3 --use-existing-work-branch.
+                                """)
+                                sys.exit(1)
                 if match_count != match_count_expected:
-                    print(f"""WARNING:
+                    print(f"""ERROR:
                     Could not find the previous -dev release string to replace in METADATA.
                     Expected to find it mentioned {match_count_expected} times, but found
                     {match_count} occurrences. Please update {metadata_path} manually and
@@ -474,6 +518,35 @@
                     f'{{ year: {today.year} month: {today.month} day: {today.day} }}',
                     metadata_path)
             subprocess.check_output('chmod u+w *', shell=True)
+            previous_version = match_value
+            if not options.version.endswith('-dev') or not previous_version.endswith('-dev'):
+                print(f'ERROR: At least one of {options.version} (new version) '
+                    + f'and {previous_version} (previous version) is not a -dev version. '
+                    + 'Expected both to be.')
+                sys.exit(1)
+            print(f'Previous version was: {previous_version}')
+            with utils.TempDir() as temp:
+                subprocess.check_call(['git', 'clone', utils.REPO_SOURCE, temp])
+                with utils.ChangedWorkingDirectory(temp):
+                    current_version_hash = find_r8_version_hash(
+                        'origin/' + branch_from_version(previous_version), previous_version)
+                    new_version_hash = find_r8_version_hash(
+                        'origin/' + branch_from_version(options.version), options.version)
+                    if not current_version_hash or not new_version_hash:
+                        print('ERROR: Failed to generate merged commits log, missing version')
+                        sys.exit(1)
+                    commits_merged = subprocess.check_output([
+                        'git',
+                        'log',
+                        '--oneline',
+                        f"{current_version_hash}..{new_version_hash}"]).decode('utf-8')
+                    if len(commits_merged) == 0:
+                        print('ERROR: Failed to generate merged commits log, commit log is empty')
+                        sys.exit(1)
+                    commit_info = (
+                        f'Commits merged (since {previous_version}):\n'
+                        + f'{commits_merged}\n'
+                        + f'See https://r8.googlesource.com/r8/+log/{new_version_hash}')
 
         with utils.ChangedWorkingDirectory(google3_base):
             blaze_result = blaze_run('//third_party/java/r8:d8 -- --version')
@@ -481,7 +554,7 @@
             assert options.version in blaze_result
 
             if not options.no_upload:
-                change_result = g4_change(options.version)
+                change_result = g4_change(options.version, commit_info)
                 change_result += 'Run \'(g4d ' + args.p4_client \
                                  + ' && tap_presubmit -p all --train -c ' \
                                  + get_cl_id(change_result) + ')\' for running TAP global' \
diff --git a/tools/startup/relayout.py b/tools/startup/relayout.py
index 3d0cd94..31a8eb6 100755
--- a/tools/startup/relayout.py
+++ b/tools/startup/relayout.py
@@ -24,6 +24,10 @@
     result = argparse.ArgumentParser(
         description='Relayout a given APK using a startup profile.')
     result.add_argument('--apk', help='Path to the .apk', required=True)
+    result.add_argument('--compress-dex',
+                        help='Whether the dex should be stored compressed',
+                        action='store_true',
+                        default=False)
     result.add_argument(
         '--desugared-library',
         choices=['auto', 'true', 'false'],
@@ -94,7 +98,10 @@
             zip_utils.add_file_to_zip(desugared_library_dex,
                                       'classes%s.dex' % str(len(dex_files) + 1),
                                       dex)
-        apk_masseur.masseur(options.apk, dex=dex, out=options.out)
+        apk_masseur.masseur(options.apk,
+                            dex=dex,
+                            out=options.out,
+                            compress_dex=options.compress_dex)
 
 
 if __name__ == '__main__':
