diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 74d7686..dcf4d30 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -119,12 +119,23 @@
     }
   }
 
+  private boolean includeMarker(Marker marker) {
+    if (marker.isRelocator()) {
+      return false;
+    }
+    assert marker.isCfBackend() || marker.isDexBackend();
+    if (options.desugarSpecificOptions().noCfMarkerForDesugaredCode) {
+      return !marker.isCfBackend() || !marker.isDesugared();
+    }
+    return true;
+  }
+
   private void writeApplication(ClassFileConsumer consumer) {
     if (proguardMapSupplier != null && options.proguardMapConsumer != null) {
       marker.setPgMapId(proguardMapSupplier.writeProguardMap().get());
     }
     Optional<String> markerString =
-        marker.isRelocator() ? Optional.empty() : Optional.of(marker.toString());
+        includeMarker(marker) ? Optional.of(marker.toString()) : Optional.empty();
     LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(appView);
     for (DexProgramClass clazz : application.classes()) {
       assert SyntheticNaming.verifyNotInternalSynthetic(clazz.getType());
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 ff1643f..7509f2a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1188,6 +1188,9 @@
     // will be passed-through without the problematic rewritings applied.
     public boolean allowAllDesugaredInput =
         System.getProperty("com.android.tools.r8.allowAllDesugaredInput") != null;
+    // See b/191469661 for why this is here.
+    public boolean noCfMarkerForDesugaredCode =
+        System.getProperty("com.android.tools.r8.noCfMarkerForDesugaredCode") != null;
   }
 
   public static class CallSiteOptimizationOptions {
diff --git a/src/test/java/com/android/tools/r8/MarkersTest.java b/src/test/java/com/android/tools/r8/MarkersTest.java
index f1baee5..d883360 100644
--- a/src/test/java/com/android/tools/r8/MarkersTest.java
+++ b/src/test/java/com/android/tools/r8/MarkersTest.java
@@ -16,6 +16,7 @@
 import static com.android.tools.r8.MarkerMatcher.markerTool;
 import static org.hamcrest.CoreMatchers.allOf;
 import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.dex.Marker;
@@ -37,26 +38,36 @@
 @RunWith(Parameterized.class)
 public class MarkersTest extends TestBase {
 
-  @Parameterized.Parameters(name = "{0}, compilationMode {1}, shrinkDesugaredLibrary {2}")
+  @Parameterized.Parameters(
+      name = "{0}, compilationMode {1}, shrinkDesugaredLibrary {2}, noCfMarkerForDesugaredCode {3}")
   public static Collection<Object[]> data() {
     return buildParameters(
         getTestParameters().withNoneRuntime().build(),
         CompilationMode.values(),
+        BooleanUtils.values(),
         BooleanUtils.values());
   }
 
   private final CompilationMode compilationMode;
   private final boolean shrinkDesugaredLibrary;
+  private final boolean noCfMarkerForDesugaredCode;
 
   public MarkersTest(
-      TestParameters parameters, CompilationMode compilationMode, boolean shrinkDesugaredLibrary) {
+      TestParameters parameters,
+      CompilationMode compilationMode,
+      boolean shrinkDesugaredLibrary,
+      boolean noCfMarkerForDesugaredCode) {
     parameters.assertNoneRuntime();
     this.compilationMode = compilationMode;
     this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.noCfMarkerForDesugaredCode = noCfMarkerForDesugaredCode;
   }
 
   @Test
   public void testL8Marker() throws Throwable {
+    // This option is not relevant for L8.
+    assumeTrue(!noCfMarkerForDesugaredCode);
+
     AndroidApiLevel apiLevel = AndroidApiLevel.L;
     Path output = temp.newFolder().toPath().resolve("desugar_jdk_libs.zip");
     L8Command.Builder builder =
@@ -109,7 +120,12 @@
             .setMode(compilationMode)
             .setMinApiLevel(apiLevel.getLevel())
             .setOutput(output, OutputMode.DexIndexed);
-    D8.run(builder.build());
+    if (noCfMarkerForDesugaredCode) {
+      ToolHelper.runD8(
+          builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+    } else {
+      D8.run(builder.build());
+    }
     Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
     Matcher<Marker> matcher =
         allOf(
@@ -136,17 +152,24 @@
             .setMode(compilationMode)
             .setMinApiLevel(apiLevel.getLevel())
             .setOutput(output, OutputMode.ClassFile);
-    D8.run(builder.build());
-    Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
-    Matcher<Marker> matcher =
-        allOf(
-            markerTool(Tool.D8),
-            markerCompilationMode(compilationMode),
-            markerBackend(Backend.CF),
-            markerIsDesugared(),
-            markerMinApi(apiLevel),
-            not(markerHasDesugaredLibraryIdentifier()));
-    assertMarkersMatch(markers, matcher);
+    if (noCfMarkerForDesugaredCode) {
+      ToolHelper.runD8(
+          builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+      Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
+      assertTrue(markers.isEmpty());
+    } else {
+      D8.run(builder.build());
+      Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
+      Matcher<Marker> matcher =
+          allOf(
+              markerTool(Tool.D8),
+              markerCompilationMode(compilationMode),
+              markerBackend(Backend.CF),
+              markerIsDesugared(),
+              markerMinApi(apiLevel),
+              not(markerHasDesugaredLibraryIdentifier()));
+      assertMarkersMatch(markers, matcher);
+    }
   }
 
   @Test
@@ -164,7 +187,13 @@
             .setMode(compilationMode)
             .setMinApiLevel(apiLevel.getLevel())
             .setOutput(output, OutputMode.DexIndexed);
-    R8.run(builder.build());
+    if (noCfMarkerForDesugaredCode) {
+      ToolHelper.runR8(
+          builder.build(),
+          options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+    } else {
+      R8.run(builder.build());
+    }
     Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
     Matcher<Marker> matcher =
         allOf(
@@ -190,7 +219,13 @@
             .addProguardConfiguration(ImmutableList.of("-keep class * { *; }"), Origin.unknown())
             .setMode(compilationMode)
             .setOutput(output, OutputMode.ClassFile);
-    R8.run(builder.build());
+    if (noCfMarkerForDesugaredCode) {
+      ToolHelper.runR8(
+          builder.build(),
+          options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+    } else {
+      R8.run(builder.build());
+    }
     Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
     Matcher<Marker> matcher =
         allOf(
@@ -210,23 +245,29 @@
 
     AndroidApiLevel apiLevel = AndroidApiLevel.L;
     Path d8DesugaredOutput = temp.newFolder().toPath().resolve("output.zip");
-    D8.run(
+    D8Command.Builder builder =
         D8Command.builder()
             .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
             .addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class))
             .setMode(compilationMode)
             .setMinApiLevel(apiLevel.getLevel())
-            .setOutput(d8DesugaredOutput, OutputMode.ClassFile)
-            .build());
-    assertMarkersMatch(
-        ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput),
-        allOf(
-            markerTool(Tool.D8),
-            markerCompilationMode(compilationMode),
-            markerIsDesugared(),
-            markerMinApi(apiLevel),
-            not(markerHasDesugaredLibraryIdentifier())));
-
+            .setOutput(d8DesugaredOutput, OutputMode.ClassFile);
+    if (noCfMarkerForDesugaredCode) {
+      ToolHelper.runD8(
+          builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+      Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput);
+      assertTrue(markers.isEmpty());
+    } else {
+      D8.run(builder.build());
+      assertMarkersMatch(
+          ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput),
+          allOf(
+              markerTool(Tool.D8),
+              markerCompilationMode(compilationMode),
+              markerIsDesugared(),
+              markerMinApi(apiLevel),
+              not(markerHasDesugaredLibraryIdentifier())));
+    }
     // Running R8 on desugared input will clear that information and leave no markers with
     // that information.
     Path output = temp.newFolder().toPath().resolve("output.zip");
