diff --git a/FuzzerDriver.cpp b/FuzzerDriver.cpp
index 418bebb..a0c9f18 100644
--- a/FuzzerDriver.cpp
+++ b/FuzzerDriver.cpp
@@ -478,8 +478,7 @@
   auto CFPath = TempPath(".fork");
   Printf("INFO: -fork=1: doing fuzzing in a separate process in order to "
          "be more resistant to crashes, timeouts, and OOMs\n");
-  auto Files =
-      CrashResistantMerge(Args, Corpora, CFPath, nullptr, nullptr);
+  auto Files = CrashResistantMerge(Args, Corpora, CFPath);
   Printf("INFO: -fork=1: seed corpus analyzed, %zd seeds chosen, starting to "
          "fuzz in separate processes\n", Files.size());
 
@@ -738,9 +737,7 @@
     }
     std::string CFPath =
         Flags.merge_control_file ? Flags.merge_control_file : TempPath(".txt");
-    auto Files =
-        CrashResistantMerge(Args, *Inputs, CFPath, Flags.load_coverage_summary,
-                            Flags.save_coverage_summary);
+    auto Files = CrashResistantMerge(Args, *Inputs, CFPath);
     for (auto &Path : Files)
       F->WriteToOutputCorpus(FileToVector(Path, Options.MaxLen));
     // We are done, delete the control file if it was a temporary one.
diff --git a/FuzzerFlags.def b/FuzzerFlags.def
index d59ee01..3296551 100644
--- a/FuzzerFlags.def
+++ b/FuzzerFlags.def
@@ -52,13 +52,6 @@
                    "If a merge process gets killed it tries to leave this file "
                    "in a state suitable for resuming the merge. "
                    "By default a temporary file will be used.")
-FUZZER_FLAG_STRING(save_coverage_summary, "Experimental:"
-                   " save coverage summary to a given file."
-                   " Used with -merge=1")
-FUZZER_FLAG_STRING(load_coverage_summary, "Experimental:"
-                   " load coverage summary from a given file."
-                   " Treat this coverage as belonging to the first corpus. "
-                   " Used with -merge=1")
 FUZZER_FLAG_INT(minimize_crash, 0, "If 1, minimizes the provided"
   " crash input. Use with -runs=N or -max_total_time=N to limit "
   "the number attempts."
diff --git a/FuzzerMerge.cpp b/FuzzerMerge.cpp
index b4f05e3..0d4971a 100644
--- a/FuzzerMerge.cpp
+++ b/FuzzerMerge.cpp
@@ -168,16 +168,6 @@
   return AllFeatures.size() - InitialNumFeatures;
 }
 
-void Merger::PrintSummary(std::ostream &OS) {
-  for (auto &File : Files) {
-    OS << std::hex;
-    OS << File.Name << " size: " << File.Size << " features: ";
-    for (auto Feature : File.Features)
-      OS << " " << Feature;
-    OS << "\n";
-  }
-}
-
 Set<uint32_t> Merger::AllFeatures() const {
   Set<uint32_t> S;
   for (auto &File : Files)
@@ -185,25 +175,6 @@
   return S;
 }
 
-Set<uint32_t> Merger::ParseSummary(std::istream &IS) {
-  std::string Line, Tmp;
-  Set<uint32_t> Res;
-  while (std::getline(IS, Line, '\n')) {
-    size_t N;
-    std::istringstream ISS1(Line);
-    ISS1 >> Tmp;  // Name
-    ISS1 >> Tmp;  // size:
-    assert(Tmp == "size:" && "Corrupt summary file");
-    ISS1 >> std::hex;
-    ISS1 >> N;    // File Size
-    ISS1 >> Tmp;  // features:
-    assert(Tmp == "features:" && "Corrupt summary file");
-    while (ISS1 >> std::hex >> N)
-      Res.insert(N);
-  }
-  return Res;
-}
-
 // Inner process. May crash if the target crashes.
 void Fuzzer::CrashResistantMergeInternalStep(const std::string &CFPath) {
   Printf("MERGE-INNER: using the control file '%s'\n", CFPath.c_str());
@@ -278,9 +249,7 @@
 Vector<std::string>
 CrashResistantMerge(const Vector<std::string> &Args,
                     const Vector<std::string> &Corpora,
-                    const std::string &CFPath,
-                    const char *CoverageSummaryInputPathOrNull,
-                    const char *CoverageSummaryOutputPathOrNull) {
+                    const std::string &CFPath) {
   size_t NumAttempts = 0;
   if (FileSize(CFPath)) {
     Printf("MERGE-OUTER: non-empty control file provided: '%s'\n",
@@ -354,19 +323,7 @@
   IF.close();
   Printf("MERGE-OUTER: consumed %zdMb (%zdMb rss) to parse the control file\n",
          M.ApproximateMemoryConsumption() >> 20, GetPeakRSSMb());
-  if (CoverageSummaryOutputPathOrNull) {
-    Printf("MERGE-OUTER: writing coverage summary for %zd files to %s\n",
-           M.Files.size(), CoverageSummaryOutputPathOrNull);
-    std::ofstream SummaryOut(CoverageSummaryOutputPathOrNull);
-    M.PrintSummary(SummaryOut);
-  }
   Set<uint32_t> InitialFeatures;
-  if (CoverageSummaryInputPathOrNull) {
-    std::ifstream SummaryIn(CoverageSummaryInputPathOrNull);
-    InitialFeatures = M.ParseSummary(SummaryIn);
-    Printf("MERGE-OUTER: coverage summary loaded from %s, %zd features found\n",
-           CoverageSummaryInputPathOrNull, InitialFeatures.size());
-  }
   Vector<std::string> NewFiles;
   size_t NumNewFeatures = M.Merge(InitialFeatures, &NewFiles);
   Printf("MERGE-OUTER: %zd new files with %zd new features added\n",
diff --git a/FuzzerMerge.h b/FuzzerMerge.h
index 917108e..273f486 100644
--- a/FuzzerMerge.h
+++ b/FuzzerMerge.h
@@ -63,8 +63,6 @@
   bool Parse(std::istream &IS, bool ParseCoverage);
   bool Parse(const std::string &Str, bool ParseCoverage);
   void ParseOrExit(std::istream &IS, bool ParseCoverage);
-  void PrintSummary(std::ostream &OS);
-  Set<uint32_t> ParseSummary(std::istream &IS);
   size_t Merge(const Set<uint32_t> &InitialFeatures,
                Vector<std::string> *NewFiles);
   size_t ApproximateMemoryConsumption() const;
@@ -74,9 +72,7 @@
 Vector<std::string>
 CrashResistantMerge(const Vector<std::string> &Args,
                     const Vector<std::string> &Corpora,
-                    const std::string &CFPath,
-                    const char *CoverageSummaryInputPathOrNull,
-                    const char *CoverageSummaryOutputPathOrNull);
+                    const std::string &CFPath);
 
 }  // namespace fuzzer
 
diff --git a/tests/FuzzerUnittest.cpp b/tests/FuzzerUnittest.cpp
index 861eaed..eec7d94 100644
--- a/tests/FuzzerUnittest.cpp
+++ b/tests/FuzzerUnittest.cpp
@@ -645,10 +645,7 @@
   Merger M;
   Vector<std::string> NewFiles;
   EXPECT_TRUE(M.Parse(Input, true));
-  std::stringstream SS;
-  M.PrintSummary(SS);
   EXPECT_EQ(NumNewFeatures, M.Merge({}, &NewFiles));
-  EXPECT_EQ(M.AllFeatures(), M.ParseSummary(SS));
   EQ(NewFiles, Result);
 }
 
