fix bugs, add tests