break out into three files
passes check without warnings