merge from shuoy's update