Everything working, can use some refactoring if time