more generic job interface