added caching layer