See design in #10
See design in #10