added caching and combined