Move a lot of common use cases into abstraction