Finished, probably, still needs lots of testing