modified by chen.d