move public to top
add race restriction.
Refactor to reuse builder code when possible.
update tests