diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
index ee0f728..f9abbbf 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
@@ -82,7 +82,6 @@
       List<String> desugaredApisSignatures) {
     for (String desugaredApisSignature : desugaredApisSignatures) {
       outputConsumer.accept(desugaredApisSignature, options.reporter);
-      outputConsumer.accept("\n", options.reporter);
     }
     outputConsumer.finished(options.reporter);
   }
@@ -100,13 +99,16 @@
 
   public static void main(String[] args) throws Exception {
     if (args.length == 4 || args.length == 5) {
-      new DesugaredMethodsList(
-              parseInt(args[0]),
-              getSpecificationArg(args[1]),
-              getImplementationArg(args[2]),
-              new StringConsumer.FileConsumer(Paths.get(args[3])),
-              ImmutableList.of(new ArchiveClassFileProvider(Paths.get(getAndroidJarPath(args, 5)))))
-          .run();
+      DesugaredMethodsListCommand.Builder builder =
+          DesugaredMethodsListCommand.builder()
+              .setMinApi(parseInt(args[0]))
+              .setDesugarLibrarySpecification(getSpecificationArg(args[1]))
+              .setOutputPath(Paths.get(args[3]));
+      for (ProgramResourceProvider programResourceProvider : getImplementationArg(args[2])) {
+        builder.addDesugarLibraryImplementation(programResourceProvider);
+      }
+      builder.addLibrary(new ArchiveClassFileProvider(Paths.get(getAndroidJarPath(args, 5))));
+      DesugaredMethodsList.run(builder.build());
       return;
     }
     throw new RuntimeException(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
index 948ea0c..924a0e6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -130,6 +131,18 @@
       return this;
     }
 
+    public Builder setOutputPath(Path outputPath) {
+      this.outputConsumer =
+          new StringConsumer.FileConsumer(outputPath) {
+            @Override
+            public void accept(String string, DiagnosticsHandler handler) {
+              super.accept(string, handler);
+              super.accept(System.lineSeparator(), handler);
+            }
+          };
+      return this;
+    }
+
     public Builder addDesugarLibraryImplementation(
         ProgramResourceProvider programResourceProvider) {
       desugarLibraryImplementation.add(programResourceProvider);
@@ -228,7 +241,7 @@
           builder.addDesugarLibraryImplementation(
               ArchiveProgramResourceProvider.fromArchive(Paths.get(argValue)));
         } else if (arg.equals("--output")) {
-          builder.setOutputConsumer(new StringConsumer.FileConsumer(Paths.get(argValue)));
+          builder.setOutputPath(Paths.get(argValue));
         } else if (arg.equals("--lib")) {
           builder.addLibrary(new ArchiveClassFileProvider(Paths.get(argValue)));
         }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index 4435768..595092b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -331,7 +331,7 @@
 
     // All retargeted methods are supported.
     machineSpecification.forEachRetargetMethod(
-        method -> registerMethod(method, implementationApplication));
+        method -> registerMethod(method, implementationApplication, backports));
 
     machineSpecification
         .getStaticFieldRetarget()
@@ -366,7 +366,8 @@
     }
   }
 
-  private void registerMethod(DexMethod method, DexApplication implementationApplication) {
+  private void registerMethod(
+      DexMethod method, DexApplication implementationApplication, List<DexMethod> backports) {
     DexClass dexClass = implementationApplication.definitionFor(method.getHolderType());
     if (dexClass != null) {
       DexEncodedMethod dexEncodedMethod = dexClass.lookupMethod(method);
@@ -381,6 +382,7 @@
     if (dexEncodedMethod != null) {
       builder.addSupportedMethod(dexClass, dexEncodedMethod);
       builder.annotateClass(dexClass.getType(), ClassAnnotation.getAdditionnalMembersOnClass());
+      backports.remove(method);
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
index 71a91d1..25494ca 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
@@ -26,7 +26,9 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -86,6 +88,10 @@
     List<String> sorted = new ArrayList<>(lintContents);
     sorted.sort(Comparator.naturalOrder());
     assertEquals(lintContents, sorted);
+
+    // No duplicates.
+    Set<String> set = new HashSet<>(lintContents);
+    assertEquals(set.size(), lintContents.size());
   }
 
   @Test
