Bunch of improvements
Starting from scratch using multimethods