refactor, reuse OnFetchedListener, use generics