add many new feature,see blow