avoid deep recursion with data channel