modified by zyh