add cache and concurrent processing