return promises instead of deferred obj