most of implementation is finished