fully polished, please report bugs.