Renamed to be more generic and support multiple implementations