done, TODO: refine the code