updated. not finished