Add timeout, and unify call() interface