I would not have if Serial.available() in loop() because that means that none of the states is called unless there is something in the Serial input buffer. And if you take characters from it with Serial,read() then there may be none left to allow the rest of the program to work.
Robin, I'm not following your logic here. There is no need to go to a state if there is nothing in the serial buffer to process. If Serial.available() is true, something is in the stack. Depending on the current state, it is read and dealt with. If nothing is left, it sits in the main loop waiting for the next string.