Adding in Latitude/Longitude input via Geonames, and lots of design refactoring