Async/Await

Async methods have been changed to use async/await keywords instead of Task.Run. The code between sync and async calls is shared as much as possible.