Many improvements, read TODO.md