                 @ensure_running(cb:cb)
             (cb) =>
                 dbg("now get the status")
-                @status
-                    cb : (err, status) =>
-                        if err
-                            cb(err)
-                        else
-                            if status.state != 'running'
-                                dbg("something went wrong and not running ?!")
-                                cb("not running")  # DO NOT CHANGE -- exact callback error is used by client code in the UI
+                f = (cb) =>
+                    @status
+                        cb : (err, status) =>
+                            if err
+                                cb(err)
                             else
-                                dbg("status includes info about address...")
-                                address =
-                                    host         : @host
-                                    port         : status['local_hub.port']
-                                    secret_token : status.secret_token
-                                cb()
+                                if status.state != 'running'
+                                    dbg("something went wrong and not running ?! -- status=#{misc.to_json(status)}")
+                                    cb("not running")  # DO NOT CHANGE -- exact callback error is used by client code in the UI
+                                else
+                                    dbg("status includes info about address...")
+                                    address =
+                                        host         : @host
+                                        port         : status['local_hub.port']
+                                        secret_token : status.secret_token
+                                    cb()
+                # we do this since state = running doesn't instantly imply status.state == running
+                misc.retry_until_success
+                    f : f
+                    start_delay : 3000
+                    max_time    : 20000
+                    cb : cb
         ], (err) =>
             if err
                 opts.cb(err)

            set_quotas : true   # if true, also sets all quotas (in parallel with start)
            cb         : required
        dbg = @dbg("start")
        if @_state == 'starting'
            dbg("already starting -- nothing to do")
            opts.cb()
            return
        async.series([
            (cb) =>

        winston.debug("wait_stable_state")
        @state    # opportunity to cause state update
            force : true
            update : true
            cb    : () =>
                @_synctable.wait
                    timeout : opts.timeout
