work almost done , need improve