diff --git a/html_orig/help.html b/html_orig/help.html
index 6f880c0..9cece09 100644
--- a/html_orig/help.html
+++ b/html_orig/help.html
@@ -18,9 +18,12 @@
 	
 		- Communication UART on pins Rx, Tx at 115200-8-1-N
- Debug log on pin GPIO2 at 115200-8-1-N-
- Use 3.3V logic, or 5V with protection resistors (10k)+
- Use 3.3V logic, or 5V with protection resistors (470R or more)+
- If the "LVD" LED on the ESP Term board lights up, the module doesn't get enough power. Check your connections.
- Connect Rx and Tx with a piece of wire to test the terminal alone, you should see what you type in the browser.
-			NOTE: This won't work if your ESP8266 board has a built-in USB-serial.+			NOTE: This won't work if your ESP8266 board has a built-in USB-serial (like NodeMCU).
+
- For best performance, use the module in the Client mode. In AP mode, check that the channel used is clear;
+			interference may cause lag in the terminal.
@@ -32,6 +35,7 @@
 		The max screen size is 2000 characters (eg. 25x80), default is 10x26. Set using\e]W<rows>;<cols>\a.
 		The screen will automatically scroll, can be used for log output.
 		Display update is sent after 20 ms of inactivity.
+		At most 4 clients can be connected at the same time.
 		The browser display needs WebSockets for the real-time updating. It may not work on really old phones / browsers.
 	
 
@@ -104,7 +108,6 @@
 
 	
 		Mouse input (click/tap) is sent as \e[<y>;<x>M. You can use this for on-screen buttons, menu navigation etc.
-		Please note this is a custom escape sequence, not supported by PuTTY or other terminals.
 	
 
 
diff --git a/html_orig/wifi.html b/html_orig/wifi.html
index bc98d63..32ee1a8 100644
--- a/html_orig/wifi.html
+++ b/html_orig/wifi.html
@@ -50,8 +50,8 @@
 		| Some changes require a reboot, dropping connection. It can take a while to re-connect. 
-				If you lose access, connect GPIO0 to GND for	5 seconds to enter Client+AP mode.
-				If that fails, try the UART factory reset command "\e]FR\a".
+				If you lose access, hold the BOOT button for 2 seconds (the Tx LED starts blinking) to re-enable AP mode.
+				If that fails, hold the BOOT button for over 5 seconds (rapid Tx LED flashing) to perform a factory reset. 
 		 | 
 	
diff --git a/user/ansi_parser_callbacks.c b/user/ansi_parser_callbacks.c
index 5d0a3bd..93622dc 100644
--- a/user/ansi_parser_callbacks.c
+++ b/user/ansi_parser_callbacks.c
@@ -232,7 +232,9 @@ apars_handle_RESET_cmd(void)
 void ICACHE_FLASH_ATTR
 apars_handle_OSC_FactoryReset(void)
 {
-	info("OSC: Factory reset");
+	warn("-------- Factory reset --------");
+
+	dbg("Switching to Client+AP mode");
 
 	// Send acknowledgement message to UART0
 	// User is performing this manually, so we can just print it as string
@@ -248,10 +250,12 @@ apars_handle_OSC_FactoryReset(void)
 	wifi_set_opmode(STATIONAP_MODE);
 
 	// --- AP config ---
+	dbg("AP WiFi channel: 6");
+
 	struct softap_config apconf;
 	wifi_softap_get_config(&apconf);
 	apconf.authmode=AUTH_OPEN; // Disable access protection
-	apconf.channel=1; // Reset channel; user may have set bad channel in the UI
+	apconf.channel=6; // Reset channel; user may have set bad channel in the UI
 
 	// generate unique AP name
 	u8 mac[6];
@@ -259,7 +263,11 @@ apars_handle_OSC_FactoryReset(void)
 	sprintf((char*)apconf.ssid, "TERM-%02X%02X%02X", mac[3], mac[4], mac[5]);
 	apconf.ssid_len = (u8)strlen((char*)apconf.ssid);
 
+	info("New AP name: %s", (char*)apconf.ssid);
+
 	// --- Station ---
+	dbg("Erasing stored WiFi credentials...");
+
 	struct station_config staconf;
 	wifi_station_get_config(&staconf);
 
@@ -268,12 +276,16 @@ apars_handle_OSC_FactoryReset(void)
 	staconf.bssid_set=0;
 	staconf.password[0]=0;
 
+	dbg("Commiting changes...");
 	wifi_softap_set_config(&apconf);
 	wifi_station_set_config(&staconf);
 
 	UART_WriteString(UART0, "Factory Reset complete, device reset.\r\n\r\n", UART_TIMEOUT_US);
 
-	// Reboot to clean STA+AP mode with Channel 1 & reset AP SSID.
+	info("*** FACTORY RESET COMPLETE ***");
+	dbg("Device reset...");
+
+	// Reboot to clean STA+AP mode with Channel X & reset AP SSID.
 	system_restart();
 }
 
diff --git a/user/io.c b/user/io.c
index f6f7b67..3516762 100644
--- a/user/io.c
+++ b/user/io.c
@@ -10,6 +10,7 @@
 
 
 #include 
+#include "ansi_parser_callbacks.h"
 
 #define BTNGPIO 0
 
@@ -17,16 +18,59 @@
 static bool enable_ap_button = false;
 
 static ETSTimer resetBtntimer;
+static ETSTimer blinkyTimer;
+
+static void ICACHE_FLASH_ATTR bootHoldIndicatorTimerCb(void *arg) {
+	static bool state = true;
+
+	if (GPIO_INPUT_GET(BTNGPIO)) {
+		// if user released, shut up
+		state = 1;
+	}
+
+	if (state) {
+		GPIO_OUTPUT_SET(1, 1);
+	} else {
+		GPIO_OUTPUT_SET(1, 0);
+	}
+
+	state = !state;
+}
 
 static void ICACHE_FLASH_ATTR resetBtnTimerCb(void *arg) {
 	static int resetCnt=0;
 	if (enable_ap_button && !GPIO_INPUT_GET(BTNGPIO)) {
 		resetCnt++;
+
+		// indicating AP reset
+		if (resetCnt == 2) {
+			PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
+			GPIO_OUTPUT_SET(1, 0); // GPIO 1 OFF
+
+			os_timer_disarm(&blinkyTimer);
+			os_timer_setfn(&blinkyTimer, bootHoldIndicatorTimerCb, NULL);
+			os_timer_arm(&blinkyTimer, 500, 1);
+		}
+
+		// indicating we'll perform a factory reset
+		if (resetCnt == 10) {
+			os_timer_disarm(&blinkyTimer);
+			os_timer_setfn(&blinkyTimer, bootHoldIndicatorTimerCb, NULL);
+			os_timer_arm(&blinkyTimer, 100, 1);
+		}
 	} else {
-		if (resetCnt>=6) { //3 sec pressed
+		// Switch Tx back to UART pin, so we can print our farewells
+		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
+
+		if (resetCnt>=10) { //5 secs pressed - FR
+			info("BOOT-button triggered FACTORY RESET!");
+			apars_handle_OSC_FactoryReset();
+		}
+		else if (resetCnt>=2) { //1 sec pressed
 			wifi_station_disconnect();
 			wifi_set_opmode(STATIONAP_MODE); //reset to AP+STA mode
-			info("Reset to AP mode from GPIO0, Restarting system...");
+			info("BOOT-button triggered reset to AP mode, restarting...");
+
 			system_restart();
 		}
 		resetCnt=0;
diff --git a/user/user_main.h b/user/user_main.h
index dc5b50d..2105906 100644
--- a/user/user_main.h
+++ b/user/user_main.h
@@ -1,7 +1,7 @@
 #ifndef USER_MAIN_H_H
 #define USER_MAIN_H_H
 
-#define FIRMWARE_VERSION "0.5.4"
+#define FIRMWARE_VERSION "0.5.5"
 #define TERMINAL_GITHUB_REPO "https://github.com/MightyPork/esp-vt100-firmware"
 
 #endif //USER_MAIN_H_H