First upload, still needs a lot of refactor but is working