update and tested