add tests
fix bugs