diff --git a/ChangeLog b/ChangeLog
index 013c69fd..3514da7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-08 Joerg Wunsch <j@uriah.heep.sax.de>
+
+	* main.c: Partially revert the line buffered output change,
+	and turn stderr into unbuffered output while producing the
+	progress report.
+
 2007-11-07 Joerg Wunsch <j@uriah.heep.sax.de>
 
 	* main.c: Add setup and teardown hooks to the programmer
diff --git a/main.c b/main.c
index db8d7bba..689e15fd 100644
--- a/main.c
+++ b/main.c
@@ -134,6 +134,8 @@ static void update_progress_tty (int percent, double etime, char *hdr)
   static int last = 0;
   int i;
 
+  setvbuf(stderr, (char*)NULL, _IONBF, 0);
+
   hashes[50] = 0;
 
   memset (hashes, ' ', 50);
@@ -156,6 +158,8 @@ static void update_progress_tty (int percent, double etime, char *hdr)
     last = 1;
     fprintf (stderr, "\n\n");
   }
+
+  setvbuf(stderr, (char*)NULL, _IOLBF, 0);
 }
 
 static void update_progress_no_tty (int percent, double etime, char *hdr)
@@ -164,6 +168,8 @@ static void update_progress_no_tty (int percent, double etime, char *hdr)
   static int last = 0;
   int cnt = (percent>>1)*2;
 
+  setvbuf(stderr, (char*)NULL, _IONBF, 0);
+
   if (hdr) {
     fprintf (stderr, "\n%s | ", hdr);
     last = 0;
@@ -183,6 +189,8 @@ static void update_progress_no_tty (int percent, double etime, char *hdr)
   }
   else
     last = (percent>>1)*2;    /* Make last a multiple of 2. */
+
+  setvbuf(stderr, (char*)NULL, _IOLBF, 0);
 }
 
 static void list_programmers_callback(const char *name, const char *desc,