diff --git a/core/app_main.c b/core/app_main.c
index 22943e7..ee27092 100644
--- a/core/app_main.c
+++ b/core/app_main.c
@@ -254,12 +254,25 @@ static void zero_bss(void) {
 
 // .Lfunc006 -- .irom0.text+0x70
 static void init_networking(sdk_phy_info_t *phy_info, uint8_t *mac_addr) {
+    // The call to sdk_register_chipv6_phy appears to change the bus clock,
+    // perhaps from 40MHz to 26MHz, at least it has such an effect on the uart
+    // baud rate. The caller flushes the TX fifos.
     if (sdk_register_chipv6_phy(phy_info)) {
         printf("FATAL: sdk_register_chipv6_phy failed");
         abort();
     }
-    uart_set_baud(0, 74906);
-    uart_set_baud(1, 74906);
+
+    // The boot rom initializes uart0 for a 115200 baud rate but the bus clock
+    // does not appear to be as expected so the initial baud rate is actually
+    // 74906. On a cold boot, to keep the 74906 baud rate the uart0 divisor
+    // would need to changed here to 74906. On a warm boot the bus clock is
+    // expected to have already been set so the boot baud rate is 115200.
+    // Reset the rate here and settle on a 115200 baud rate.
+    if (sdk_rst_if.reason > 0) {
+        uart_set_baud(0, 115200);
+        uart_set_baud(1, 115200);
+    }
+
     sdk_phy_disable_agc();
     sdk_ieee80211_phy_init(sdk_g_ic.s.phy_mode);
     sdk_lmacInit();
diff --git a/open_esplibs/libmain/user_interface.c b/open_esplibs/libmain/user_interface.c
index ad9dca0..4d2123a 100644
--- a/open_esplibs/libmain/user_interface.c
+++ b/open_esplibs/libmain/user_interface.c
@@ -20,6 +20,7 @@
 #include "esp/iomux_regs.h"
 #include "esp/sar_regs.h"
 #include "esp/wdev_regs.h"
+#include "esp/uart.h"
 
 #include "etstimer.h"
 #include "espressif/sdk_private.h"
@@ -79,16 +80,23 @@ void IRAM sdk_system_restart_in_nmi(void) {
         buf[0] = 3;
         sdk_system_rtc_mem_write(0, buf, 32);
     }
+
+    uart_flush_txfifo(0);
+    uart_flush_txfifo(1);
+
     if (!sdk_NMIIrqIsOn) {
         portENTER_CRITICAL();
         do {
             DPORT.DPORT0 = SET_FIELD(DPORT.DPORT0, DPORT_DPORT0_FIELD0, 0);
         } while (DPORT.DPORT0 & 1);
     }
+
     ESPSAR.UNKNOWN_48 |= 3;
     DPORT.CLOCKGATE_WATCHDOG |= DPORT_CLOCKGATE_WATCHDOG_UNKNOWN_8;
     ESPSAR.UNKNOWN_48 &= ~3;
     DPORT.CLOCKGATE_WATCHDOG &= ~DPORT_CLOCKGATE_WATCHDOG_UNKNOWN_8;
+
+    Wait_SPI_Idle(&sdk_flashchip);
     Cache_Read_Disable();
     DPORT.SPI_CACHE_RAM &= ~(DPORT_SPI_CACHE_RAM_BANK0 | DPORT_SPI_CACHE_RAM_BANK1);
     // This calls directly to 0x40000080, the "reset" exception vector address.
@@ -559,8 +567,8 @@ enum sdk_dhcp_status sdk_wifi_station_dhcpc_status(void) {
 
 void sdk_system_uart_swap()
 {
-    while (FIELD2VAL(UART_STATUS_TXFIFO_COUNT, UART(0).STATUS)) {};
-    while (FIELD2VAL(UART_STATUS_TXFIFO_COUNT, UART(1).STATUS)) {};
+    uart_flush_txfifo(0);
+    uart_flush_txfifo(1);
 
     /* Disable pullup IO_MUX_MTDO, Alt TX. GPIO15. */
     iomux_set_pullup_flags(3, 0);
@@ -576,8 +584,8 @@ void sdk_system_uart_swap()
 
 void sdk_system_uart_de_swap()
 {
-    while (FIELD2VAL(UART_STATUS_TXFIFO_COUNT, UART(0).STATUS)) {};
-    while (FIELD2VAL(UART_STATUS_TXFIFO_COUNT, UART(1).STATUS)) {};
+    uart_flush_txfifo(0);
+    uart_flush_txfifo(1);
 
     /* Disable pullup IO_MUX_U0TXD, TX. GPIO 1. */
     iomux_set_pullup_flags(5, 0);