diff --git a/board/inteno/common/board.c b/board/inteno/common/board.c
index bb63bab8a55f701c754d246950f79989300d6ad8..f8001aca5ca412503914712aa5b894e78b3d1d67 100644
--- a/board/inteno/common/board.c
+++ b/board/inteno/common/board.c
@@ -278,7 +278,7 @@ int board_late_init(void)
 #define RT2880_PRGIO_ADDR       (RALINK_SYSCTL_BASE + 0x600) // Programmable I/O
 #define RT2880_REG_PIODIR       (RT2880_PRGIO_ADDR + 0x00)
 #define RT2880_REG_PIODATA      (RT2880_PRGIO_ADDR + 0x20)
-
+extern int first_press_check;
 static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	int opt;
@@ -297,6 +297,7 @@ static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                         return 1;
                 }
         }
+		
 	if (do_button){
 		//set GPIO18 as input, this is the factory default button
 		RALINK_REG(RT2880_REG_PIODIR)&= ~(1<<18); //input mode
@@ -309,11 +310,18 @@ static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	set_led(LED_WPS, LED_STATE_ON);
 	run_command("net_init",0);
 	printf("Entering rescue mode\n");
+	first_press_check = 1;
 	run_command("httpd",0);
 
         return 0;
 }
 
+int reset_button_is_pressed(void)
+{
+	RALINK_REG(RT2880_REG_PIODIR)&= ~(1<<18); //input mode
+	return (RALINK_REG(RT2880_REG_PIODATA) & 1<<18)?0:1;
+}
+
 
 U_BOOT_CMD(
         rescue,   2,      0,      do_rescue,
diff --git a/board/inteno/common/lwip_start.c b/board/inteno/common/lwip_start.c
index 67da87a8089ed17c6237eabc4061caf8824b0402..ed99d103fce54747f593151e44f8bb6f587f4de8 100644
--- a/board/inteno/common/lwip_start.c
+++ b/board/inteno/common/lwip_start.c
@@ -18,8 +18,11 @@
 
 #include "lwip_start.h"
 
+#include "led.h"
+
 u32_t sys_now(void);
 static void lwip_periodic_handle( void );
+extern int reset_button_is_pressed();
 
 /* from net.h but its hard to include that one. here */
 void net_init(void);
@@ -31,6 +34,7 @@ void eth_halt(void);
 int eth_send(void *packet, int length);
 
 #define ETHERNET_MTU 1500
+#define GPIO_RESET_BUTTON	41
 
 extern u8 net_ethaddr[6];
 extern int lwip_redirect;
@@ -42,11 +46,128 @@ struct netif netif;
 static int loop_active;
 static int delay_start;
 
+enum reset_btn_status
+{
+	reset_btn_release,
+	reset_btn_hold,
+	reset_btn_handle
+};
+
+static int reset_btn_state = reset_btn_release;
+static int reset_count = 0;
+static int current_lit = 1; // switching sucessful change led
+static int rec_pkt_cnt = 0;
+static int null_pkt_cnt = 0;
+int first_press_check = 0; // =0 null, =1 rec
+#define REC_PACKET_INC() (rec_pkt_cnt++)
+#define NULL_PACKET_INC() (null_pkt_cnt++)
+
+
+
 u32_t sys_now(void)
 {
         //printf("%s not implemented\n",__func__);
         return 0;
 }
+static void check_reset_button(int sleep_time)
+{
+	int btn = 0;
+	btn = reset_button_is_pressed();
+	if(first_press_check)
+	{
+		if(!btn)//first enter button has released
+		{
+			first_press_check = 0;
+		}
+		return;
+	}
+	
+	if(reset_btn_state != reset_btn_release && sleep_time)
+		   mdelay(sleep_time);
+	
+	if(reset_btn_state == reset_btn_release)
+	{
+		if(btn)//button is pressed
+		{
+			if(++reset_count > 5)//confirm btn pressed
+			{
+				reset_btn_state = reset_btn_hold;
+				reset_count = 0;
+			}
+		}
+		else
+		{
+			reset_count = 0;
+		}
+	}
+	else if(reset_btn_state == reset_btn_hold)
+	{
+		if(btn)
+		{
+			if(++reset_count > 5)//confirm btn pressed
+			{
+				reset_btn_state = reset_btn_handle;
+				reset_count = 0;
+			}
+		}
+		else
+		{
+			reset_btn_state = reset_btn_release;
+			reset_count = 0;
+		}
+	}
+	else if(reset_btn_state == reset_btn_handle)
+	{
+		if(!btn)
+		{
+			if(++reset_count > 5)//stay in button handle state for 5 times
+			{
+				int next_vol = 0;
+				unsigned long cur_vol = 0;
+				char *s;
+				char *fs_name[]={"rootfs_0","rootfs_1"};
+				char *root_name="root_vol";
+				//get current ubi_fs
+				s = getenv(root_name);
+				//switch ubi_fs
+				//next_vol = (strcmp(s,fs_name[0]))?0:1;
+                cur_vol = simple_strtoul(s + strlen("rootfs_"), NULL, 10);
+				next_vol = !cur_vol;
+				setenv(root_name,fs_name[next_vol]);
+				printf("bootfs set to %s volume\n",fs_name[next_vol]);
+				reset_btn_state = reset_btn_release;
+				reset_count = 0;
+				
+				if(current_lit)
+					set_led(LED_WPS, LED_STATE_OFF);
+				else
+					set_led(LED_WPS, LED_STATE_ON);
+				current_lit = !current_lit;
+				loop_active = 0;
+			}
+			
+		}
+		else
+		{
+			reset_count = 0;
+		}
+	}
+}
+
+static void do_btn_handle(int tick_time)
+{
+	int need_check = 0;
+	if(null_pkt_cnt > tick_time)
+		{
+			check_reset_button(100);
+			null_pkt_cnt = 0;
+		}
+     else if(rec_pkt_cnt > tick_time)
+     	{
+     		check_reset_button(10);
+			rec_pkt_cnt = 0;
+     	}
+}
 
 /*
    called from net_process_received_packet() in net/net.c when a new packet is received.
@@ -189,9 +310,12 @@ void lwip_break( int delay)
         }
 }
 
+//set_led
+//add a new feature to check pressbutton
 
 err_t lwip_loop( int timeout)
 {
+	int is_rec = 0;
         loop_active = 1;
         timeout_active = 0;
         delay_start = 0;
@@ -209,8 +333,15 @@ err_t lwip_loop( int timeout)
                 /* if something has been received process it */
 		if(eth_rx() > 0)
 		{
-                        lwip_periodic_handle();
-                }
+             lwip_periodic_handle();
+			 //LOCK_BTN();
+			 REC_PACKET_INC();
+        }
+		else
+		{
+			 NULL_PACKET_INC();
+		}
+		
                 /* exit on ctrl-c */
 		if(ctrlc()){
 			printf("\nlwip stop. due to ctrlc\n\n");
@@ -218,7 +349,10 @@ err_t lwip_loop( int timeout)
                         loop_active = 0;
                         return ERR_IF;
 		}
-
+		
+		/*do reset button check*/
+		//if(LOCK_VALID())
+		do_btn_handle(100);
                 /* do we have a delayed shutdown ? */
                 if(loop_active < 0){
                         if ((-1*loop_active) < get_timer(delay_start)){