Complete, should refactor heavily