Finished (now needs lot and lot of testing)!