another design rethinking related to #25 and #21