implemented all requirements