add caching and loading indicator