Overhaul my earlier submission due to feedback. It's a large patch, but most of