All features so far done, needs a bit more testing