recursive, safe