Where asynchronicity comes into play is when you load data from your backend services. This has to be done on a background thread because otherwise the UI would be blocked. There are multiple ways of handling this. You can use standard JavaFX Services and Tasks, you can use CompletableFutures (there is an example for this here: https://github.com/sialcasa/mvvmFX/tree/develop/examples/mini-examples/async-todoapp-futures) or you can use mvvmFX Commands which is a mechanism developed by us and described here: https://github.com/sialcasa/mvvmFX/wiki/Commands. Basically it's only a choice of what API you prefer.