modify by xu