using models, keeping things DRY