diff --git a/firmware/0x00000.bin b/firmware/0x00000.bin
index 05bfbbb..14b9fe1 100644
Binary files a/firmware/0x00000.bin and b/firmware/0x00000.bin differ
diff --git a/firmware/0x10000.bin b/firmware/0x10000.bin
index 361facb..c6992ca 100644
Binary files a/firmware/0x10000.bin and b/firmware/0x10000.bin differ
diff --git a/firmware/libmqtt.a b/firmware/libmqtt.a
index 731e52c..f7d132a 100644
Binary files a/firmware/libmqtt.a and b/firmware/libmqtt.a differ
diff --git a/firmware/sha1sums b/firmware/sha1sums
index afcb8d4..302ed32 100644
--- a/firmware/sha1sums
+++ b/firmware/sha1sums
@@ -1,2 +1,2 @@
-1d6892b006fe44833bfe79867f4547a498f52807  0x00000.bin
-53a7491e2066f612ecb22901ef8b5e700f14e41a  0x10000.bin
+6a34ad8fa228aea1d144d4c3f193a90b49d27c53  0x00000.bin
+75e586b61a2a6924d1e6186d8b0a466cc2063a61  0x10000.bin
diff --git a/mqtt/include/mqtt.h b/mqtt/include/mqtt.h
index c33d471..9832393 100644
--- a/mqtt/include/mqtt.h
+++ b/mqtt/include/mqtt.h
@@ -70,6 +70,7 @@ typedef enum {
   DNS_RESOLVE,
   TCP_DISCONNECTING,
   TCP_DISCONNECTED,
+  TCP_DISCONNECT,
   TCP_RECONNECT_DISCONNECTING,
   TCP_RECONNECT_REQ,
   TCP_RECONNECT,
diff --git a/mqtt/mqtt_server.c b/mqtt/mqtt_server.c
index 3365641..f0cf94d 100644
--- a/mqtt/mqtt_server.c
+++ b/mqtt/mqtt_server.c
@@ -37,6 +37,7 @@ LOCAL MqttDataCallback local_data_cb = NULL;
 LOCAL MqttConnectCallback local_connect_cb = NULL;
 LOCAL MqttAuthCallback local_auth_cb = NULL;
 
+//#undef MQTT_INFO
 //#define MQTT_INFO os_printf
 #define MQTT_WARNING os_printf
 #define MQTT_ERROR os_printf
@@ -101,8 +102,8 @@ bool ICACHE_FLASH_ATTR delete_client_by_id(const uint8_t *id) {
     for (clientcon = clientcon_list; clientcon != NULL; clientcon = clientcon->next) {
 	if (os_strcmp(id, clientcon->connect_info.client_id) == 0) {
 	    MQTT_INFO("MQTT: Disconnect client: %s\r\n", clientcon->connect_info.client_id);
-	    clientcon->connState = TCP_DISCONNECTED;
-	    espconn_disconnect(clientcon->pCon);
+	    clientcon->connState = TCP_DISCONNECT;
+	    system_os_post(MQTT_SERVER_TASK_PRIO, 0, (os_param_t) clientcon);
 	    return true;
 	}
     }
@@ -254,7 +255,7 @@ void ICACHE_FLASH_ATTR MQTT_ServerDisconnect(MQTT_ClientCon * mqttClientCon) {
     MQTT_INFO("MQTT:ServerDisconnect\r\n");
 
     mqttClientCon->mqtt_state.message_length_read = 0;
-    mqttClientCon->connState = TCP_DISCONNECTED;
+    mqttClientCon->connState = TCP_DISCONNECT;
     system_os_post(MQTT_SERVER_TASK_PRIO, 0, (os_param_t) mqttClientCon);
     os_timer_disarm(&mqttClientCon->mqttTimer);
 }
@@ -531,6 +532,11 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns
 			      clientcon->connect_info.password==NULL?"":clientcon->connect_info.password,
 			      clientcon->pCon) == false) {
 		MQTT_WARNING("MQTT: Authorization failed\r\n");
+
+		if (clientcon->connect_info.will_topic != NULL) {
+		    os_free(clientcon->connect_info.will_topic);
+		    clientcon->connect_info.will_topic = NULL;
+		}
 		msg_conn_ret = CONNECTION_REFUSE_NOT_AUTHORIZED;
 		clientcon->connState = TCP_DISCONNECTING;
 		break;
@@ -776,8 +782,8 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_sent_cb(void *arg) {
     clientcon->sendTimeout = 0;
 
     if (clientcon->connState == TCP_DISCONNECTING) {
-	clientcon->connState = TCP_DISCONNECTED;
-	espconn_disconnect(clientcon->pCon);
+	clientcon->connState = TCP_DISCONNECT;
+	system_os_post(MQTT_SERVER_TASK_PRIO, 0, (os_param_t) clientcon);
     }
 
     activate_next_client();
@@ -791,12 +797,6 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_connected_cb(void *arg) {
 
     MQTT_INFO("MQTT_ClientCon_connected_cb(): Client connected\r\n");
 
-    if (local_connect_cb != NULL && local_connect_cb(pespconn) == false) {
-	MQTT_INFO("Connected not allowed\r\n");
-	espconn_disconnect(pespconn);
-	return;
-    }
-
     espconn_regist_sentcb(pespconn, MQTT_ClientCon_sent_cb);
     espconn_regist_disconcb(pespconn, MQTT_ClientCon_discon_cb);
     espconn_regist_recvcb(pespconn, MQTT_ClientCon_recv_cb);
@@ -814,6 +814,12 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_connected_cb(void *arg) {
 
     os_timer_setfn(&mqttClientCon->mqttTimer, (os_timer_func_t *) mqtt_server_timer, mqttClientCon);
     os_timer_arm(&mqttClientCon->mqttTimer, 1000, 1);
+
+    if (local_connect_cb != NULL && local_connect_cb(pespconn) == false) {
+	mqttClientCon->connState = TCP_DISCONNECT;
+	system_os_post(MQTT_SERVER_TASK_PRIO, 0, (os_param_t) mqttClientCon);
+	return;
+    }
 }
 
 void ICACHE_FLASH_ATTR MQTT_ServerTask(os_event_t * e) {
@@ -827,7 +833,7 @@ void ICACHE_FLASH_ATTR MQTT_ServerTask(os_event_t * e) {
 
     switch (clientcon->connState) {
 
-    case TCP_DISCONNECTED:
+    case TCP_DISCONNECT:
 	MQTT_INFO("MQTT: Disconnect\r\n");
 	espconn_disconnect(clientcon->pCon);
 	break;
diff --git a/user/user_main.c b/user/user_main.c
index 3f08013..04a6512 100644
--- a/user/user_main.c
+++ b/user/user_main.c
@@ -761,6 +761,9 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) {
 	    blob_zero(RETAINED_SLOT, MAX_RETAINED_LEN);
 #endif
 	}
+
+	save_retainedtopics();
+
 	os_printf("Restarting ... \r\n");
 	system_restart();	// if it works this will not return