modify by weilin