update by zj sencond