 			} while (parseCommandGServo(&endptr, speedControl, wait) && !servoMoveError);
 			for (i = 0; !servoMoveError && i < servoMoveCount; ++i) {
 				// perform this move, if the last move in the list, use the wait variable value and update display
-				servoMoves[i].moveServoFuncPtr(servoMoves[i].pos, servoMoves[i].servoSpeed, 
-					(i == servoMoveCount - 1 ? false : wait), (i == servoMoveCount - 1 ? true : false));
+				servoMoves[i].moveServoFuncPtr(servoMoves[i].pos, servoMoves[i].servoSpeed, false,
+					(i == servoMoveCount - 1 ? true : false));
+			}
+			// do software wait while updating widgets
+			if (!servoMoveError && wait) {
+				bool done = false;
+				while (!done) {
+					servoWidgetUpdate();
+					done = true;
+					for (i = 0; i < servoMoveCount; ++i) {
+						switch (servoMoves[i].servoShortName) {
+							case 'L':
+								if (servoMoves[i].pos != servoL.read())
+									done = false;
+								break;
+							case 'R':
+								if (servoMoves[i].pos != servoR.read())
+									done = false;
+								break;
+							case 'O':
+								if (servoMoves[i].pos != servoRot.read())
+									done = false;
+								break;
+							case 'T':
+								if (servoMoves[i].pos != servoHRot.read())
+									done = false;
+								break;
+							case 'H':
+								if (servoMoves[i].pos != servoH.read())
+									done = false;
+								break;
+							default:
+								break;
+						}
+					}
+				}
 			}
 			if (i != 0) {
 				sendMsg(F("OK\n"));

		if (*buf != endptr && pos >= 0 && pos <= 180) {
			for (; **buf == ' ' || **buf == '\t'; (*buf)++);
			servoMoves[servoMoveCount].moveServoFuncPtr = moveServoFuncPtr;
			servoMoves[servoMoveCount].pos = pos;
			servoMoves[servoMoveCount].servoSpeed = servoSpeedLocal;
			servoMoveCount++;

			}
		}
	} else {
		servoWidgetUpdate();
	}
}
