change a lot
final version