Did a whole lot of implementation. Feel free to look through it