                                 @_project_cache[opts.project_id] = project
                                 cb()
             (cb) =>
-                if not opts.open
+                if not (opts.opened or opts.running)
                     cb()
                 else
+                    dbg("ensure at least opened")
                     p.state
-                        cb : (err, state) =>
-                            if err or state.state != 'closed' and state.state != 'closing'
+                        cb : (err, s) =>
+                            if err
                                 cb(err)
                                 return
+                            state = s.state
+                            if state == 'opening'
+                                p.once 'opened', () =>
+                                    state = 'opened'
+                                    cb()
+                                return
+                            if state != 'closed' and state != 'closing'
+                                cb(err)
+                                return
+                            # Finally deal with case of closed or closing.
                             # This is tricky: in close state, we request open and wait
                             # for project to open; in closing state, we wait until closed
                             # then request open and wait until open.

                    dbg("getting other project and ensuring that it is already opened")
                    @compute_server.project
                        project_id : opts.target_project_id
                        open       : true
                        cb         : (err, target_project) =>
                            if err
                                dbg("error ")

    project: (opts) =>
        opts = defaults opts,
            project_id : required
            opened     : false    # if true, only returns after ensuring project is opened on some host (which may take minutes)
            running    : false    # if true, ensures project is started before returning
            cb         : required
        if not @_project_cache?
            @_project_cache = {}
        p = @_project_cache[opts.project_id]
        state = undefined
        dbg = @dbg("project(#{opts.project_id}, open=#{opts.opened}, start=#{opts.running})")
        async.series([
            (cb) =>
                dbg("get project")
                if p?
                    cb()
                else
