diff --git a/src/fw_downloader/fw_downloader.cpp b/src/fw_downloader/fw_downloader.cpp
index 61f96dcbf7e8a8d8f9aca3e6f134d3e763ce2640..82ed684111d60fb33a57fc1d6cb77e4828775cec 100755
--- a/src/fw_downloader/fw_downloader.cpp
+++ b/src/fw_downloader/fw_downloader.cpp
@@ -16,6 +16,7 @@ const unsigned char bootloader_load='l';
 const unsigned char bootloader_go='g';
 const unsigned char bootloader_dump='d';
 const unsigned char bootloader_clear='c';
+const unsigned char bootloader_app='a';
 
 typedef enum {original_protocol=0,new_protocol=1} protocol_t;
 
@@ -133,7 +134,7 @@ int main(int argc,char *argv[])
       {
         try{
           if((num_data=serial_port.get_num_data()==0))
-            event_server->wait_all(events,100);
+            event_server->wait_all(events,20);
           num_data=serial_port.get_num_data();
           serial_port.read((unsigned char *)bootloader_data,num_data);
           bootloader_data[num_data]='\0';
@@ -357,6 +358,25 @@ int main(int argc,char *argv[])
           }
         }
       }
+      // go to application mode
+      serial_port.write((unsigned char *)&bootloader_app,1);
+      if(protocol==new_protocol)
+        serial_port.write((unsigned char *)&bootloader_ack,1);
+      end=false;
+      while(!end)
+      {
+        try{
+          event_server->wait_all(events,300);
+          // there has been an error
+          num_data=serial_port.get_num_data();
+          serial_port.read(bootloader_data,num_data);
+          bootloader_data[num_data]='\0';
+          printf("%s",bootloader_data);
+        }catch(CEventTimeoutException &e){
+          // no error to report
+          end=true;
+        }
+      }
       // start the loaded program
       serial_port.write((unsigned char *)&bootloader_go,1);
       if(protocol==new_protocol)