Pretty much done. Just need command cancellation