Completely generalise movement and move it into another thread