done some implementation