modify by zyc