 }
 
 static void writeText(String s) {
-  // overwrite write text
-  text = s;
-  text.toUpperCase();
-
-  // reset current state
-  bot.resetPosition();
-}
+  if (s.length() > 0) {
+    char c = s[0];  // grab the next character to write
+    
+    // put the rest of the command back at the beginning of the queue
+    cmdQ.insert(s.substring(1), LOGO_CMD_WT);
+
+    // use the LogobotText library to write the letter
+    LogobotText::writeChar(c, bot.state.x, bot.state.y);  
+  } 
+}

            break;
        case LOGO_CMD_SE:
            bot.emergencyStop();
			text = "";
            break;
		case LOGO_CMD_CS:
			bot.resetPosition();

  bot.initBuzzer(BUZZER_PIN);
  //bot.lookAheadEnable(true);
  bot.playStartupJingle();
  LogobotText::begin(textQ);
}

void loop()
{
  // Parse Logo commands from Serial
  if (Serial.available()) {
    char c = toupper(Serial.read());
    if (c == '\r' || c == '\n') {  // if found a line end
      if (cmd != "") {  // check the command isn't blank
        if (cmd == "STAT") { // handle status commands: execute immediately, no need to parse and/or queue
