update by zj first