internal API simplified