Implement the rest, needs some testing