for internal use