diff --git a/Fred_bootloader/Fred_bootloader.atsuo b/Fred_bootloader/Fred_bootloader.atsuo
index 471d4105d291e8faa22abb93728603eb9a53638a..ffb553a450bbae02b9a7df0aba262361f8a0350c 100644
Binary files a/Fred_bootloader/Fred_bootloader.atsuo and b/Fred_bootloader/Fred_bootloader.atsuo differ
diff --git a/Fred_bootloader/src/bootloader.c b/Fred_bootloader/src/bootloader.c
index 31fd88cd8ac03a7b521e84855044902e4f46aad6..4d5c5715383c3bdce78e8748eef1cc85627d445a 100644
--- a/Fred_bootloader/src/bootloader.c
+++ b/Fred_bootloader/src/bootloader.c
@@ -8,6 +8,7 @@
 #include "timer_lib.h"
 #include "usart_lib.h"
 #include <avr/eeprom.h>
+#include <util/delay.h>
 #include <asf.h>
 #include <ccp.h>
 
@@ -34,7 +35,7 @@ void start_firmware()
 
 void start_bootloader()
 {
-	uint8_t chr = 0, temp, error_counter = 0;
+	uint8_t chr = 0, error_counter = 0;
 	bool err = false, escape = false;	
 	while(true)
 	{
@@ -60,6 +61,7 @@ void start_bootloader()
 				usart_putchar(USART_SERIAL, BOOTLDR_RES_OK);
 				usart_putchar(USART_SERIAL, handshake);
 				timer_reset_counter();
+				eeprom_write_upgrade_started();
 				state = DATA;
 			break;
 			
@@ -193,6 +195,7 @@ void eeprom_write_upgrade( void )
 void eeprom_write_ready( void )
 {
 	eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWREADY_VALUE);
+	_delay_ms(40);
 }
 
 bool eeprom_read_upgrade( void )
@@ -209,3 +212,13 @@ bool read_compare_checksum(void)
 	usart_serial_getchar(USART_SERIAL, &chr);	
 	return (chr == checksum);	
 }
+
+void eeprom_write_upgrade_started( void )
+{
+	eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWUPGRADE_STARTED);
+}
+
+bool eeprom_is_pending( void )
+{
+	return eeprom_read_byte(EEPROM_ADDR_FWUPGRADE) == EEPROM_FWUPGRADE_STARTED;
+}
diff --git a/Fred_bootloader/src/bootloader.h b/Fred_bootloader/src/bootloader.h
index e67b4812b75ae99aef8bd711de9b29b8c56309e8..7216982606a7e3e63db2d93fe67e7649746f3483 100644
--- a/Fred_bootloader/src/bootloader.h
+++ b/Fred_bootloader/src/bootloader.h
@@ -13,6 +13,7 @@
 #include <stdint.h>
 
 typedef enum {INIT, HANDSHAKE, DATA, FINISH} BootloaderState;
+extern BootloaderState state;
 
 #define BOOTLDR_ESCAPE 0x01	
 #define BOOTLDR_HANDSHAKE 0x02
@@ -29,13 +30,16 @@ typedef enum {INIT, HANDSHAKE, DATA, FINISH} BootloaderState;
 
 #define EEPROM_ADDR_FWUPGRADE (uint8_t *) 63
 #define EEPROM_FWUPGRADE_VALUE			(uint8_t)   0x56
-#define EEPROM_FWREADY_VALUE			(uint8_t)  0x55
+#define EEPROM_FWREADY_VALUE			(uint8_t)   0x55
+#define EEPROM_FWUPGRADE_STARTED		(uint8_t)	0x44
 
 void start_bootloader(void);
 void start_firmware(void);
 void eeprom_write_upgrade(void);
+void eeprom_write_upgrade_started(void);
 void eeprom_write_ready(void);
 bool eeprom_read_upgrade(void);
+bool eeprom_is_pending(void);
 void checksum_add_byte(uint8_t byte);
 bool read_compare_checksum(void);
 
diff --git a/Fred_bootloader/src/timer_lib.c b/Fred_bootloader/src/timer_lib.c
index 6f623ae161321f276a3158e1fdde9eb8ce0c0c2d..7c899a68196125a1520944d52da2a39e528cdcd4 100644
--- a/Fred_bootloader/src/timer_lib.c
+++ b/Fred_bootloader/src/timer_lib.c
@@ -29,6 +29,7 @@
 
 #include "timer_lib.h"
 #include "usart_lib.h"
+#include "bootloader.h"
 
 #define PERIOD_10MS		1250
 #define PERIOD_100MS	12500
@@ -54,11 +55,15 @@ static void tc_overflow_callback(void)				//100 ms
 		ioport_toggle_pin(MMC_LED);
 		sec_counter = 0;
 	}
-	//RESET after 20 s of inactivity
-	if (idle_counter == 200)
+	//RESET after 10 s of inactivity
+	if (idle_counter == INACTIVITY_BEFORE_RESET_S*10)
 	{
-		//printString("Reset");
 		//reset processor
+		if (state == INIT || state == HANDSHAKE)
+		{
+			if (!eeprom_is_pending())
+				eeprom_write_ready();
+		}
 		ccp_write_io((void *)&RST.CTRL, RST_SWRST_bm);
 	}
 }
diff --git a/Fred_bootloader/src/timer_lib.h b/Fred_bootloader/src/timer_lib.h
index a097601e20c21dac5540f9c6996f01e793d88c7b..876987e52168b830ab70cb1509e76956dc686eae 100644
--- a/Fred_bootloader/src/timer_lib.h
+++ b/Fred_bootloader/src/timer_lib.h
@@ -28,6 +28,8 @@
 #ifndef TIMER_LIB_H_
 #define TIMER_LIB_H_
 
+#define INACTIVITY_BEFORE_RESET_S	10
+
 extern volatile bool timer_100ms_flag;
 
 void timer_init(void);