A long overdue refactor. I started it ~6 months ago but never go around committing to it due to more important things. To keep it short, @RaitaroH would you be free to help out with testing?