Needs more testing. (And bonus)