implement snapshot feature