TODO: fix bugs