1.2.0: Rewritten and better design