diff --git a/adb/bugreport.cpp b/adb/bugreport.cpp
index 8a3eb08..64f01bd 100644
--- a/adb/bugreport.cpp
+++ b/adb/bugreport.cpp
@@ -30,7 +30,12 @@
 class BugreportStandardStreamsCallback : public StandardStreamsCallbackInterface {
   public:
     BugreportStandardStreamsCallback(const std::string& dest_file, bool show_progress, Bugreport* br)
-        : br_(br), dest_file_(dest_file), show_progress_(show_progress), status_(-1), line_() {
+        : br_(br),
+          dest_file_(dest_file),
+          line_message_(android::base::StringPrintf("generating %s", dest_file_.c_str())),
+          show_progress_(show_progress),
+          status_(-1),
+          line_() {
     }
 
     void OnStdout(const char* buffer, int length) {
@@ -62,12 +67,12 @@
         if (android::base::StartsWith(line, BUGZ_OK_PREFIX)) {
             if (show_progress_) {
                 // Make sure pull message doesn't conflict with generation message.
-                br_->UpdateProgress(dest_file_, 100, 100, true);
+                br_->UpdateProgress(line_message_, 100, 100);
             }
 
             const char* zip_file = &line[strlen(BUGZ_OK_PREFIX)];
             std::vector<const char*> srcs{zip_file};
-            status_ = br_->DoSyncPull(srcs, dest_file_.c_str(), true, dest_file_.c_str()) ? 0 : 1;
+            status_ = br_->DoSyncPull(srcs, dest_file_.c_str(), true, line_message_.c_str()) ? 0 : 1;
             if (status_ != 0) {
                 fprintf(stderr, "Could not copy file '%s' to '%s'\n", zip_file, dest_file_.c_str());
             }
@@ -96,6 +101,7 @@
 
     Bugreport* br_;
     const std::string dest_file_;
+    const std::string line_message_;
     bool show_progress_;
     int status_;
 
@@ -156,15 +162,11 @@
     return SendShellCommand(transport_type, serial, bugz_command, false, &bugz_callback);
 }
 
-void Bugreport::UpdateProgress(const std::string& file_name, int progress, int total,
-                               bool keep_info_line) {
+void Bugreport::UpdateProgress(const std::string& message, int progress, int total) {
     int progress_percentage = (progress * 100 / total);
-    line_printer_.Print(android::base::StringPrintf("[%3d%%] generating %s", progress_percentage,
-                                                    file_name.c_str()),
-                        LinePrinter::INFO);
-    if (keep_info_line) {
-        line_printer_.KeepInfoLine();
-    }
+    line_printer_.Print(
+        android::base::StringPrintf("[%3d%%] %s", progress_percentage, message.c_str()),
+        LinePrinter::INFO);
 }
 
 int Bugreport::SendShellCommand(TransportType transport_type, const char* serial,
diff --git a/adb/bugreport.h b/adb/bugreport.h
index fd11a4a..ee99cbc 100644
--- a/adb/bugreport.h
+++ b/adb/bugreport.h
@@ -43,8 +43,7 @@
                             const char* name);
 
   private:
-    virtual void UpdateProgress(const std::string& file_name, int progress, int total,
-                                bool keep_info_line = false);
+    virtual void UpdateProgress(const std::string& file_name, int progress, int total);
     LinePrinter line_printer_;
     DISALLOW_COPY_AND_ASSIGN(Bugreport);
 };
diff --git a/adb/bugreport_test.cpp b/adb/bugreport_test.cpp
index e695b24..a89d8dc 100644
--- a/adb/bugreport_test.cpp
+++ b/adb/bugreport_test.cpp
@@ -117,7 +117,7 @@
                      bool disable_shell_protocol, StandardStreamsCallbackInterface* callback));
     MOCK_METHOD4(DoSyncPull, bool(const std::vector<const char*>& srcs, const char* dst,
                                   bool copy_attrs, const char* name));
-    MOCK_METHOD4(UpdateProgress, void(const std::string&, int, int, bool));
+    MOCK_METHOD3(UpdateProgress, void(const std::string&, int, int));
 };
 
 class BugreportTest : public ::testing::Test {
@@ -129,8 +129,8 @@
                             WithArg<4>(ReturnCallbackDone(0))));
     }
 
-    void ExpectProgress(int progress, int total, bool keep_info_line = false) {
-        EXPECT_CALL(br_, UpdateProgress(StrEq("file.zip"), progress, total, keep_info_line));
+    void ExpectProgress(int progress, int total) {
+        EXPECT_CALL(br_, UpdateProgress(HasSubstr("file.zip"), progress, total));
     }
 
     BugreportMock br_;
@@ -159,7 +159,7 @@
         .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
                         WithArg<4>(ReturnCallbackDone())));
     EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
-                                true, StrEq("file.zip")))
+                                true, HasSubstr("file.zip")))
         .WillOnce(Return(true));
 
     const char* args[1024] = {"bugreport", "file.zip"};
@@ -175,7 +175,7 @@
                         WithArg<4>(WriteOnStdout("/bugreport.zip")),
                         WithArg<4>(ReturnCallbackDone())));
     EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
-                                true, StrEq("file.zip")))
+                                true, HasSubstr("file.zip")))
         .WillOnce(Return(true));
 
     const char* args[1024] = {"bugreport", "file.zip"};
@@ -189,7 +189,7 @@
     ExpectProgress(10, 100);
     ExpectProgress(50, 100);
     ExpectProgress(99, 100);
-    ExpectProgress(100, 100, true);
+    ExpectProgress(100, 100);
     // clang-format off
     EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
         .WillOnce(DoAll(
@@ -208,7 +208,7 @@
             WithArg<4>(WriteOnStdout(".zip")),
             WithArg<4>(ReturnCallbackDone())));
     EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
-                                true, StrEq("file.zip")))
+                                true, HasSubstr("file.zip")))
         .WillOnce(Return(true));
 
     const char* args[1024] = {"bugreport", "file.zip"};
@@ -218,12 +218,12 @@
 // Tests 'adb bugreport file' when it succeeds
 TEST_F(BugreportTest, OkNoExtension) {
     SetBugreportzVersion("1.1");
-    ExpectProgress(100, 100, true);
+    ExpectProgress(100, 100);
     EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
         .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip\n")),
                         WithArg<4>(ReturnCallbackDone())));
     EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
-                                true, StrEq("file.zip")))
+                                true, HasSubstr("file.zip")))
         .WillOnce(Return(true));
 
     const char* args[1024] = {"bugreport", "file"};
@@ -294,12 +294,12 @@
 // Tests 'adb bugreport file.zip' when the bugreport could not be pulled
 TEST_F(BugreportTest, PullFails) {
     SetBugreportzVersion("1.1");
-    ExpectProgress(100, 100, true);
+    ExpectProgress(100, 100);
     EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
         .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
                         WithArg<4>(ReturnCallbackDone())));
     EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
-                                true, StrEq("file.zip")))
+                                true, HasSubstr("file.zip")))
         .WillOnce(Return(false));
 
     const char* args[1024] = {"bugreport", "file.zip"};
