finish most implementation