Sure, this was rather tricky. The problem is that if the task is executed locally, this future should return exactly the value returned by the command. If the future is executed remotely, the RpcManagerImpl will provide you with a map of responses which you have to unpack first. Also, the RpcManagerImpl expects NotifyingNotifiableFuture<Object> (Object for the response), while DistributedTaskPart implements NotifyingFuture<V> (the generics matter). The local future is required so that we don't need to implement the synchronization and listener management details.