needs some cleanup, but it's starting to look good