TODO: fix stack overflow