First *nice* looking version - lot of replicated code, but we have the basic generations