diff --git a/nm-auth-dialog.c b/nm-auth-dialog.c
index dd696de..11191fd 100644
--- a/nm-auth-dialog.c
+++ b/nm-auth-dialog.c
@@ -85,6 +85,7 @@ typedef struct auth_ui_data {
 
 	int retval;
 	int cookie_retval;
+	int first_try; /* first connection attempt */
 
 	gboolean cancelled; /* fully cancel the whole challenge-response series */
 	gboolean getting_cookie;
@@ -1101,6 +1102,7 @@ static gboolean cookie_obtained(auth_ui_data *ui_data)
 		ui_data->retval = 1;
 	} else if (!ui_data->cookie_retval) {
 		/* got cookie */
+		remember_gconf_key(ui_data, g_strdup("cookie"), g_strdup(ui_data->vpninfo->cookie));
 		while (ui_data->success_keys) {
 			struct gconf_key *k = ui_data->success_keys;
 			char *key = g_strdup_printf("%s/vpn/%s", config_path, k->key);
@@ -1146,10 +1148,23 @@ static gboolean cookie_obtained(auth_ui_data *ui_data)
 gpointer obtain_cookie (auth_ui_data *ui_data)
 {
 	int ret;
+	char *cookie;
+
+	/* try to use cookie from gconf first */
+	if (ui_data->first_try) {
+		cookie = get_gconf_setting(gcl, config_path, NM_OPENCONNECT_KEY_COOKIE);
+		if (cookie) {
+			ui_data->vpninfo->cookie = cookie;
+			ui_data->cookie_retval = 0;
+			ui_data->first_try = 0;
+		} else {
+			fprintf(stderr, "No webvpn cookie (optional) configured\n");
+		}
+	} else {
+		ret = openconnect_obtain_cookie(ui_data->vpninfo);
+		ui_data->cookie_retval = ret;
+	}
 
-	ret = openconnect_obtain_cookie(ui_data->vpninfo);
-
-	ui_data->cookie_retval = ret;
 	g_idle_add ((GSourceFunc)cookie_obtained, ui_data);
 
 	return NULL;
@@ -1381,6 +1396,7 @@ static auth_ui_data *init_ui_data (char *vpn_name)
 
 	ui_data = g_slice_new0(auth_ui_data);
 	ui_data->retval = 1;
+	ui_data->first_try = 1;
 
 	ui_data->form_entries = g_queue_new();
 	ui_data->form_mutex = g_mutex_new();
