First attempt

Tried to break out everything to make it basic. Will refactor and fix stuff later.