             // Echo an error back to remote terminal if in command mode.
             if (Modem_isCommandMode && wifly.available() > 0)
             {
-                wifly.println(F("error: remote modem is in command mode."));
+                // If we print this, remote end gets flooded with this message 
+                // if we go to command mode on the C64 and remote side sends something..
+                //wifly.println(F("error: remote modem is in command mode."));
             }
             else
             {
-                while (wifly.available() > 0)
-                {
-                    DoFlowControlModemToC64();
-                    C64Serial.write(wifly.read());
-                    // TODO:  Review..  Flow control?
+                if (baudMismatch) {   // If host is slower than WiFly we need to buffer.  Only used for 1200 baud.
+                    while (wifly.available() > 0)
+                    {
+                        digitalWriteFast(WIFI_CTS, HIGH);     // ..stop data from Wi-Fi
+
+                        data = wifly.read();
+                        buffer[buffer_index++] = data;
+                        if (buffer_index > 99)
+                            buffer_index = 99;
+                    }
+
+                    // Dump the buffer to the C64 before clearing WIFI_CTS
+                    for (int i = 0; i<buffer_index; i++) {
+                        C64Serial.write(buffer[i]);
+
+                        /* NOTE:  For Menu firmware, we also process C64Serial.available here.
+                                  May not be needed as 1200 baud upload and download test passed,
+                                  but when trying to use joe editor in Linux at 1200 baud, it loses
+                                  a lot of characters when typing.  Same for Menu firmware. */
+                    }
+
+                    
+                    // Only used for displaying max buffer size on Microview for testing
+                    if (max_buffer_size_reached < buffer_index)
+                    max_buffer_size_reached = buffer_index;
+                    char message[20];
+                    sprintf_P(message, PSTR("Buf: %d"), max_buffer_size_reached);
+                    Display(message);
+
+                    // Show largest buffer size on Microview
+                    // 4800/9600 = 3
+                    // 4800/19200 = 5
+                    // 1200/19200 = doesn't work
+                    // 4800/38400 = 12
+                    // 2400/38400 = 40 - bbs.jammingsignal.com:23 (1200 baud) worked.
+                    // 2400/38400 = 40 - cib.dyndns.com:6400 (19200 baud) worked.
+                    // 2400/38400 = 40 - Linux telnet did not work with Novaterm.  Default flow tolerance = 200.  Set to 100 and sometimes connected.
+                    // 9600/38400 = 11           
+
+                    buffer_index = 0;
+
+                    digitalWriteFast(WIFI_CTS, LOW);
+                }
+                else {
+                    while (wifly.available() > 0)
+                    {
+                        DoFlowControlModemToC64();
+                        C64Serial.write(wifly.read());
+                    }
                 }
             }
         }

#else
    if (Modem_DCDFollowsRemoteCarrier)
        digitalWriteFast(C64_DCD, Modem_ToggleCarrier(true));
#endif

    TerminalMode();
}

void TerminalMode()

char Modem_LastCommandBuffer[COMMAND_BUFFER_SIZE];
char Modem_CommandBuffer[COMMAND_BUFFER_SIZE];

// Misc Values
#define TIMEDOUT  -1
boolean baudMismatch = (BAUD_RATE != WiFly_BAUD_RATE ? 1 : 0);
