some modification and new