diff --git a/.gitignore b/.gitignore
index bb6648e..8114ef4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -273,10 +273,12 @@
 third_party/proguard/*
 third_party/proguardsettings.tar.gz
 third_party/proguardsettings/
-third_party/proto.tar.gz
-third_party/proto/
-third_party/protobuf-lite.tar.gz
-third_party/protobuf-lite/
+third_party/proto/runtime/legacy
+third_party/proto/runtime/legacy.tar.gz
+third_party/proto/test/proto2
+third_party/proto/test/proto2.tar.gz
+third_party/proto/test/proto3
+third_party/proto/test/proto3.tar.gz
 third_party/r8
 third_party/r8.tar.gz
 third_party/r8-releases/2.0.74
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index bdbd79e..2620a18 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -614,15 +614,20 @@
     Paths.get("third_party", "proguardsettings").toFile(),
     Paths.get("third_party", "proguardsettings.tar.gz.sha1").toFile(),
     DependencyType.X20)
-  val proto = ThirdPartyDependency(
-    "proto",
-    Paths.get("third_party", "proto").toFile(),
-    Paths.get("third_party", "proto.tar.gz.sha1").toFile(),
+  val protoRuntimeLegacy = ThirdPartyDependency(
+    "protoRuntimeLegacy",
+    Paths.get("third_party", "proto", "runtime", "legacy").toFile(),
+    Paths.get("third_party", "proto", "runtime", "legacy.tar.gz.sha1").toFile(),
     DependencyType.X20)
-  val protobufLite = ThirdPartyDependency(
-    "protobuf-lite",
-    Paths.get("third_party", "protobuf-lite").toFile(),
-    Paths.get("third_party", "protobuf-lite.tar.gz.sha1").toFile(),
+  val protoTestProto2 = ThirdPartyDependency(
+    "protoTestProto2",
+    Paths.get("third_party", "proto", "test", "proto2").toFile(),
+    Paths.get("third_party", "proto", "test", "proto2.tar.gz.sha1").toFile(),
+    DependencyType.X20)
+  val protoTestProto3 = ThirdPartyDependency(
+    "protoTestProto3",
+    Paths.get("third_party", "proto", "test", "proto3").toFile(),
+    Paths.get("third_party", "proto", "test", "proto3.tar.gz.sha1").toFile(),
     DependencyType.X20)
   val r8 = ThirdPartyDependency(
     "r8",
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderOnlyReferencedFromDynamicMethodTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderOnlyReferencedFromDynamicMethodTest.java
index 53e5b8a..ed6f6fd 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderOnlyReferencedFromDynamicMethodTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderOnlyReferencedFromDynamicMethodTest.java
@@ -14,38 +14,31 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
-import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class Proto2BuilderOnlyReferencedFromDynamicMethodTest extends ProtoShrinkingTestBase {
 
   private static final String MAIN = "proto2.BuilderOnlyReferencedFromDynamicMethodTestClass";
 
-  private static List<Path> PROGRAM_FILES =
-      ImmutableList.of(PROTO2_EXAMPLES_JAR, PROTO2_PROTO_JAR, PROTOBUF_LITE_JAR);
+  @Parameter(0)
+  public TestParameters parameters;
 
-  private final TestParameters parameters;
-
-  @Parameterized.Parameters(name = "{0}")
+  @Parameters(name = "{0}")
   public static TestParametersCollection data() {
     return getTestParameters().withDefaultDexRuntime().withAllApiLevels().build();
   }
 
-  public Proto2BuilderOnlyReferencedFromDynamicMethodTest(TestParameters parameters) {
-    this.parameters = parameters;
-  }
-
   @Test
   public void test() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(PROGRAM_FILES)
+        .apply(this::addProto2TestSources)
+        .apply(this::addLegacyRuntime)
         .addKeepMainRule(MAIN)
-        .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
         .allowAccessModification()
         .allowDiagnosticMessages()
         .allowUnusedDontWarnPatterns()
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
index c786a4b..abedac8 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -71,9 +70,6 @@
   private static final String METHOD_TO_INVOKE_ENUM =
       "com.google.protobuf.GeneratedMessageLite$MethodToInvoke";
 
-  private static List<Path> PROGRAM_FILES =
-      ImmutableList.of(PROTO2_EXAMPLES_JAR, PROTO2_PROTO_JAR, PROTOBUF_LITE_JAR);
-
   @Parameter(0)
   public MainClassesConfig config;
 
@@ -91,9 +87,9 @@
   public void test() throws Exception {
     R8TestCompileResult result =
         testForR8(parameters.getBackend())
-            .addProgramFiles(PROGRAM_FILES)
+            .apply(this::addProto2TestSources)
+            .apply(this::addLegacyRuntime)
             .addKeepMainRules(config.getMainClasses())
-            .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
             .allowAccessModification()
             .allowDiagnosticMessages()
             .allowUnusedDontWarnPatterns()
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
index 270116a..462515f 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
@@ -21,11 +21,12 @@
 import com.android.tools.r8.utils.codeinspector.analysis.ProtoApplicationStats;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import java.nio.file.Path;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class Proto2ShrinkingTest extends ProtoShrinkingTestBase {
@@ -50,14 +51,16 @@
   private static final String USES_ONLY_REPEATED_FIELDS =
       "com.android.tools.r8.proto2.Shrinking$UsesOnlyRepeatedFields";
 
-  private static List<Path> PROGRAM_FILES =
-      ImmutableList.of(PROTO2_EXAMPLES_JAR, PROTO2_PROTO_JAR, PROTOBUF_LITE_JAR);
+  @Parameter(0)
+  public boolean allowAccessModification;
 
-  private final boolean allowAccessModification;
-  private final boolean enableMinification;
-  private final TestParameters parameters;
+  @Parameter(1)
+  public boolean enableMinification;
 
-  @Parameterized.Parameters(name = "{2}, allow access modification: {0}, enable minification: {1}")
+  @Parameter(2)
+  public TestParameters parameters;
+
+  @Parameters(name = "{2}, allow access modification: {0}, enable minification: {1}")
   public static List<Object[]> data() {
     return buildParameters(
         BooleanUtils.values(),
@@ -65,21 +68,13 @@
         getTestParameters().withDefaultDexRuntime().withAllApiLevels().build());
   }
 
-  public Proto2ShrinkingTest(
-      boolean allowAccessModification, boolean enableMinification, TestParameters parameters) {
-    this.allowAccessModification = allowAccessModification;
-    this.enableMinification = enableMinification;
-    this.parameters = parameters;
-  }
-
   @Test
   public void test() throws Exception {
-    CodeInspector inputInspector = new CodeInspector(PROGRAM_FILES);
     R8TestRunResult result =
         testForR8(parameters.getBackend())
-            .addProgramFiles(PROGRAM_FILES)
+            .apply(this::addProto2TestSources)
+            .apply(this::addLegacyRuntime)
             .addKeepMainRule("proto2.TestClass")
-            .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
             // TODO(b/173340579): This rule should not be needed to allow shrinking of
             //  PartiallyUsed$Enum.
             .addNoHorizontalClassMergingRule(PARTIALLY_USED + "$Enum$1")
@@ -97,6 +92,7 @@
             .apply(this::inspectWarningMessages)
             .inspect(
                 outputInspector -> {
+                  CodeInspector inputInspector = getProto2TestSourcesInspector();
                   verifyMapAndRequiredFieldsAreKept(inputInspector, outputInspector);
                   verifyUnusedExtensionsAreRemoved(inputInspector, outputInspector);
                   verifyUnusedFieldsAreRemoved(inputInspector, outputInspector);
@@ -133,7 +129,8 @@
                 "10");
 
     DexItemFactory dexItemFactory = new DexItemFactory();
-    ProtoApplicationStats original = new ProtoApplicationStats(dexItemFactory, inputInspector);
+    ProtoApplicationStats original =
+        new ProtoApplicationStats(dexItemFactory, getProto2TestSourcesInspector());
     ProtoApplicationStats actual =
         new ProtoApplicationStats(dexItemFactory, result.inspector(), original);
 
@@ -375,9 +372,9 @@
   @Test
   public void testNoRewriting() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(PROGRAM_FILES)
+        .apply(this::addProto2TestSources)
+        .apply(this::addLegacyRuntime)
         .addKeepMainRule("proto2.TestClass")
-        .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
         // Retain all protos.
         .addKeepRules(keepAllProtosRule())
         // Retain the signature of dynamicMethod() and newMessageInfo().
@@ -395,16 +392,15 @@
         .apply(this::inspectWarningMessages)
         .inspect(
             inspector ->
-                assertRewrittenProtoSchemasMatch(new CodeInspector(PROGRAM_FILES), inspector));
+                assertRewrittenProtoSchemasMatch(getProto2TestSourcesInspector(), inspector));
   }
 
   @Test
   public void testTwoExtensionRegistrys() throws Exception {
-    CodeInspector inputInspector = new CodeInspector(PROGRAM_FILES);
     testForR8(parameters.getBackend())
-        .addProgramFiles(PROGRAM_FILES)
+        .apply(this::addProto2TestSources)
+        .apply(this::addLegacyRuntime)
         .addKeepMainRule("proto2.TestClass")
-        .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
         .addKeepRules(findLiteExtensionByNumberInDuplicateCalledRule())
         // TODO(b/173340579): This rule should not be needed to allow shrinking of
         //  PartiallyUsed$Enum.
@@ -422,6 +418,7 @@
         .apply(this::inspectWarningMessages)
         .inspect(
             outputInspector -> {
+              CodeInspector inputInspector = getProto2TestSourcesInspector();
               verifyUnusedExtensionsAreRemoved(inputInspector, outputInspector);
               verifyUnusedExtensionsAreRemoved(
                   inputInspector,
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
index b390c77..49fdd08 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
@@ -16,8 +16,6 @@
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -29,9 +27,6 @@
   private static final String PARTIALLY_USED =
       "com.android.tools.r8.proto3.Shrinking$PartiallyUsed";
 
-  private static List<Path> PROGRAM_FILES =
-      ImmutableList.of(PROTO3_EXAMPLES_JAR, PROTO3_PROTO_JAR, PROTOBUF_LITE_JAR);
-
   private final boolean allowAccessModification;
   private final boolean enableMinification;
   private final TestParameters parameters;
@@ -53,11 +48,10 @@
 
   @Test
   public void test() throws Exception {
-    CodeInspector inputInspector = new CodeInspector(PROGRAM_FILES);
     testForR8(parameters.getBackend())
-        .addProgramFiles(PROGRAM_FILES)
+        .apply(this::addProto3TestSources)
+        .apply(this::addLegacyRuntime)
         .addKeepMainRule("proto3.TestClass")
-        .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
         .allowAccessModification(allowAccessModification)
         .allowDiagnosticMessages()
         .allowUnusedDontWarnPatterns()
@@ -71,6 +65,7 @@
         .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
         .inspect(
             outputInspector -> {
+              CodeInspector inputInspector = getProto3TestSourcesInspector();
               verifyUnusedFieldsAreRemoved(inputInspector, outputInspector);
             })
         .run(parameters.getRuntime(), "proto3.TestClass")
@@ -100,9 +95,9 @@
   @Test
   public void testNoRewriting() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(PROGRAM_FILES)
+        .apply(this::addProto3TestSources)
+        .apply(this::addLegacyRuntime)
         .addKeepMainRule("proto3.TestClass")
-        .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
         // Retain all protos.
         .addKeepRules(keepAllProtosRule())
         // Retain the signature of dynamicMethod() and newMessageInfo().
@@ -123,6 +118,6 @@
                 containsString("required for default or static interface methods desugaring")))
         .inspect(
             inspector ->
-                assertRewrittenProtoSchemasMatch(new CodeInspector(PROGRAM_FILES), inspector));
+                assertRewrittenProtoSchemasMatch(getProto3TestSourcesInspector(), inspector));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java b/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
index f0db90b..cd21b9f 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
@@ -11,9 +11,10 @@
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.startsWith;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
@@ -27,43 +28,24 @@
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.google.common.collect.ImmutableList;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
+import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
 public abstract class ProtoShrinkingTestBase extends TestBase {
 
-  public static final Path PROTOBUF_LITE_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "protobuf-lite/libprotobuf_lite.jar");
-
-  public static final Path PROTOBUF_LITE_PROGUARD_RULES =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "protobuf-lite/lite_proguard.pgcfg");
-
-  // Test classes for proto2. Use a checked in version of the built examples.
-  public static final Path PROTO2_EXAMPLES_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "proto", "examplesProto2.jar");
-
-  // Proto definitions used by test classes for proto2.
-  public static final Path PROTO2_PROTO_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "proto", "examplesGeneratedProto2.jar");
-
-  // Test classes for proto3.
-  public static final Path PROTO3_EXAMPLES_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "proto", "examplesProto3.jar");
-
-  // Proto definitions used by test classes for proto3.
-  public static final Path PROTO3_PROTO_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "proto", "examplesGeneratedProto3.jar");
-
   public static void assertRewrittenProtoSchemasMatch(
       CodeInspector expectedInspector, CodeInspector actualInspector) throws Exception {
     Map<String, IntList> actualInfos = getInfoValues(actualInspector);
 
     // Ensure that this cannot fail silently.
-    assertTrue(actualInfos.size() > 0);
+    assertFalse(actualInfos.isEmpty());
 
     Map<String, IntList> expectedInfos = getInfoValues(expectedInspector);
     for (Map.Entry<String, IntList> entry : actualInfos.entrySet()) {
@@ -75,6 +57,47 @@
     }
   }
 
+  void addLegacyRuntime(R8TestBuilder<?> testBuilder) {
+    Path runtimeDir = Paths.get(ToolHelper.PROTO_RUNTIME_DIR, "legacy");
+    addRuntime(testBuilder, runtimeDir);
+  }
+
+  private void addRuntime(R8TestBuilder<?> testBuilder, Path runtimeDir) {
+    testBuilder
+        .addProgramFiles(runtimeDir.resolve("libprotobuf_lite.jar"))
+        .addKeepRuleFiles(runtimeDir.resolve("lite_proguard.pgcfg"));
+  }
+
+  void addProto2TestSources(R8TestBuilder<?> testBuilder) {
+    testBuilder.addProgramFiles(getProto2TestSources());
+  }
+
+  void addProto3TestSources(R8TestBuilder<?> testBuilder) {
+    testBuilder.addProgramFiles(getProto3TestSources());
+  }
+
+  private Collection<Path> getProto2TestSources() {
+    Path testDir = Paths.get(ToolHelper.PROTO_TEST_DIR, "proto2");
+    return getTestSources(testDir);
+  }
+
+  private Collection<Path> getProto3TestSources() {
+    Path testDir = Paths.get(ToolHelper.PROTO_TEST_DIR, "proto3");
+    return getTestSources(testDir);
+  }
+
+  private Collection<Path> getTestSources(Path testDir) {
+    return ImmutableList.of(testDir.resolve("proto.jar"), testDir.resolve("test.jar"));
+  }
+
+  CodeInspector getProto2TestSourcesInspector() throws IOException {
+    return new CodeInspector(getProto2TestSources());
+  }
+
+  CodeInspector getProto3TestSourcesInspector() throws IOException {
+    return new CodeInspector(getProto3TestSources());
+  }
+
   static String findLiteExtensionByNumberInDuplicateCalledRule() {
     return StringUtils.lines(
         "-keep class com.google.protobuf.proto2_registryGeneratedExtensionRegistryLiteDuplicate {",
diff --git a/src/test/testbase/java/com/android/tools/r8/ToolHelper.java b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
index b8eb897..8fd3b6b 100644
--- a/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
@@ -186,6 +186,9 @@
   public static final String LIBS_DIR = BUILD_DIR + "libs/";
   public static final String THIRD_PARTY_DIR = getProjectRoot() + "third_party/";
   public static final String DEPENDENCIES = THIRD_PARTY_DIR + "dependencies/";
+  public static final String PROTO_DIR = THIRD_PARTY_DIR + "proto/";
+  public static final String PROTO_RUNTIME_DIR = PROTO_DIR + "runtime/";
+  public static final String PROTO_TEST_DIR = PROTO_DIR + "test/";
   public static final String TOOLS_DIR = getProjectRoot() + "tools/";
   public static final String TESTS_DIR = getProjectRoot() + "src/test/";
   public static final String ART_TESTS_ROOT = getProjectRoot() + "tests/";
diff --git a/third_party/proto.tar.gz.sha1 b/third_party/proto.tar.gz.sha1
deleted file mode 100644
index 5d43e3e..0000000
--- a/third_party/proto.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c8330e345ab2a6d0ef90f0b3232e03e072d5a234
\ No newline at end of file
diff --git a/third_party/proto/runtime/legacy.tar.gz.sha1 b/third_party/proto/runtime/legacy.tar.gz.sha1
new file mode 100644
index 0000000..297987d
--- /dev/null
+++ b/third_party/proto/runtime/legacy.tar.gz.sha1
@@ -0,0 +1 @@
+798c2243e9aca81f1e2ee19392a0fef65122faed
\ No newline at end of file
diff --git a/third_party/proto/test/proto2.tar.gz.sha1 b/third_party/proto/test/proto2.tar.gz.sha1
new file mode 100644
index 0000000..50f5c12
--- /dev/null
+++ b/third_party/proto/test/proto2.tar.gz.sha1
@@ -0,0 +1 @@
+1c5e343395ba01cc37b9ec264b2af75f58bd08bc
\ No newline at end of file
diff --git a/third_party/proto/test/proto3.tar.gz.sha1 b/third_party/proto/test/proto3.tar.gz.sha1
new file mode 100644
index 0000000..815a03a
--- /dev/null
+++ b/third_party/proto/test/proto3.tar.gz.sha1
@@ -0,0 +1 @@
+4540501e8fbd15b555db561168595d73f39328a9
\ No newline at end of file
diff --git a/third_party/protobuf-lite.tar.gz.sha1 b/third_party/protobuf-lite.tar.gz.sha1
deleted file mode 100644
index 77f4e56..0000000
--- a/third_party/protobuf-lite.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-047e2914d6898dc764803e7709eda60f7de1ecfa
\ No newline at end of file
