all working (apart from swapping direction)