diff --git a/ui/ncurses/generic-main.c b/ui/ncurses/generic-main.c
index 27744d4..7062796 100644
--- a/ui/ncurses/generic-main.c
+++ b/ui/ncurses/generic-main.c
@@ -49,8 +49,8 @@ static void print_usage(void)
 {
 	print_version();
 	printf(
-"%s: petitboot-nc [-h, --help] [-l, --log log-file]\n"
-"                    [-s, --start-daemon] [-v, --verbose] [-V, --version]\n",
+"%s: petitboot-nc [-h, --help] [-l, --log log-file] [-s, --start-daemon]\n"
+"                    [-t, --timeout] [-v, --verbose] [-V, --version]\n",
 			_("Usage"));
 }
 
@@ -68,6 +68,7 @@ struct opts {
 	enum opt_value show_help;
 	const char *log_file;
 	enum opt_value start_daemon;
+	enum opt_value timeout;
 	enum opt_value verbose;
 	enum opt_value show_version;
 };
@@ -82,11 +83,12 @@ static int opts_parse(struct opts *opts, int argc, char *argv[])
 		{"help",         no_argument,       NULL, 'h'},
 		{"log",          required_argument, NULL, 'l'},
 		{"start-daemon", no_argument,       NULL, 's'},
+		{"timeout",	 no_argument,	    NULL, 't'},
 		{"verbose",      no_argument,       NULL, 'v'},
 		{"version",      no_argument,       NULL, 'V'},
 		{ NULL,          0,                 NULL, 0},
 	};
-	static const char short_options[] = "dhl:svV";
+	static const char short_options[] = "dhl:stvV";
 	static const struct opts default_values = { 0 };
 
 	*opts = default_values;
@@ -108,6 +110,9 @@ static int opts_parse(struct opts *opts, int argc, char *argv[])
 		case 's':
 			opts->start_daemon = opt_yes;
 			break;
+		case 't':
+			opts->timeout = opt_yes;
+			break;
 		case 'v':
 			opts->verbose = opt_yes;
 			break;
@@ -244,7 +249,7 @@ int main(int argc, char *argv[])
 		return EXIT_FAILURE;
 	}
 
-	cui = cui_init(NULL, NULL, opts.start_daemon);
+	cui = cui_init(NULL, NULL, opts.start_daemon, opts.timeout);
 	if (!cui)
 		return EXIT_FAILURE;
 
diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c
index 6888fa7..e2a744d 100644
--- a/ui/ncurses/nc-cui.c
+++ b/ui/ncurses/nc-cui.c
@@ -423,7 +423,7 @@ static int cui_process_key(void *arg)
 		if (c == ERR)
 			break;
 
-		if (!cui->has_input) {
+		if (!cui->has_input && cui->client) {
 			pb_log("UI input received (key = %d), aborting "
 					"default boot\n", c);
 			discover_client_cancel_default(cui->client);
@@ -798,13 +798,15 @@ static int menu_lang_execute(struct pmenu_item *item)
 
 static int menu_reinit_execute(struct pmenu_item *item)
 {
-	cui_send_reinit(cui_from_item(item));
+	if (cui_from_item(item)->client)
+		cui_send_reinit(cui_from_item(item));
 	return 0;
 }
 
 static int menu_add_url_execute(struct pmenu_item *item)
 {
-	cui_show_add_url(cui_from_item(item));
+	if (cui_from_item(item)->client)
+		cui_show_add_url(cui_from_item(item));
 	return 0;
 }
 
@@ -894,6 +896,39 @@ static struct discover_client_ops cui_client_ops = {
 	.update_config = cui_update_config,
 };
 
+/* cui_server_wait - Connect to the discover server.
+ * @arg: Pointer to the cui instance.
+ *
+ * A timeout callback that attempts to connect to the discover server; on
+ * failure it registers itself with a one second timeout to try again.
+ * On success the cui->client struct will be set.
+ */
+static int cui_server_wait(void *arg)
+{
+	struct cui *cui = cui_from_arg(arg);
+
+	if (cui->client) {
+		pb_debug("We already have a server!\n");
+		return 0;
+	}
+
+	/* We haven't yet connected to the server */
+	pb_log("Trying to connect...\n");
+	cui->client = discover_client_init(cui->waitset,
+			&cui_client_ops, cui);
+
+	if (!cui->client) {
+		waiter_register_timeout(cui->waitset, 1000, cui_server_wait,
+					cui);
+		nc_scr_status_printf(cui->current, "Info: Waiting for server");
+	} else {
+		nc_scr_status_printf(cui->current, "Info: Connected to server!");
+		talloc_steal(cui, cui->client);
+	}
+
+	return 0;
+}
+
 /**
  * cui_init - Setup the cui instance.
  * @platform_info: A value for the struct cui platform_info member.
@@ -905,7 +940,7 @@ static struct discover_client_ops cui_client_ops = {
  */
 
 struct cui *cui_init(void* platform_info,
-	int (*js_map)(const struct js_event *e), int start_daemon)
+	int (*js_map)(const struct js_event *e), int start_daemon, int timeout)
 {
 	struct cui *cui;
 	unsigned int i;
@@ -926,7 +961,7 @@ struct cui *cui_init(void* platform_info,
 	/* Loop here for scripts that just started the server. */
 
 retry_start:
-	for (i = start_daemon ? 2 : 15; i; i--) {
+	for (i = start_daemon ? 2 : 15; i && timeout; i--) {
 		cui->client = discover_client_init(cui->waitset,
 				&cui_client_ops, cui);
 		if (cui->client || !i)
@@ -953,7 +988,10 @@ retry_start:
 		goto fail_client_init;
 	}
 
-	if (!cui->client) {
+	if (!cui->client && !timeout) {
+		waiter_register_timeout(cui->waitset, 1000,
+					cui_server_wait, cui);
+	} else if (!cui->client) {
 		pb_log("%s: discover_client_init failed.\n", __func__);
 		fprintf(stderr, _("%s: error: discover_client_init failed.\n"),
 			__func__);
diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h
index afdb3c8..b00d251 100644
--- a/ui/ncurses/nc-cui.h
+++ b/ui/ncurses/nc-cui.h
@@ -72,7 +72,7 @@ struct cui {
 
 struct cui *cui_init(void* platform_info,
 		int (*js_map)(const struct js_event *e),
-		int start_daemon);
+		int start_daemon, int timeout);
 struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr);
 int cui_run(struct cui *cui);
 void cui_item_edit(struct pmenu_item *item);
