fix and improve a lot