First attempt at making it Async
More refactoring.
Async optimisation complete.