Updated, still a work in progress :p