diff -ru links-0.96/cookies.c links-0.96+cookies-resave/cookies.c
--- links-0.96/cookies.c	Tue Oct  2 17:29:36 2001
+++ links-0.96+cookies-resave/cookies.c	Tue Oct  2 17:28:50 2001
@@ -1,5 +1,8 @@
 #include "links.h"
 
+/* #undef it defaultly */
+#define COOKIES_RESAVE	1
+
 #define ACCEPT_NONE	0
 #define ACCEPT_ASK	1
 #define ACCEPT_ALL	2
@@ -41,6 +44,8 @@
 void accept_cookie(struct cookie *);
 void delete_cookie(struct cookie *);
 
+void load_cookies(), save_cookies();
+
 void free_cookie(struct cookie *c)
 {
 	if (c->name) mem_free(c->name);
@@ -161,6 +166,9 @@
 	if (!(cd = mem_alloc(sizeof(struct c_domain) + strlen(c->domain) + 1))) return;
 	strcpy(cd->domain, c->domain);
 	add_to_list(c_domains, cd);
+#ifdef COOKIES_RESAVE
+	save_cookies();
+#endif
 }
 
 void delete_cookie(struct cookie *c)
@@ -177,6 +185,9 @@
 	del_from_list(c);
 	free_cookie(c);
 	mem_free(c);
+#ifdef COOKIES_RESAVE
+	save_cookies();
+#endif
 }
 
 struct cookie *find_cookie_id(void *idp)
@@ -261,6 +272,9 @@
 			del_from_list(d);
 			free_cookie(d);
 			mem_free(d);
+#ifdef COOKIES_RESAVE
+			save_cookies();
+#endif
 			continue;
 		}
 		if (c->secure) continue;
@@ -274,11 +288,11 @@
 	mem_free(server);
 }
 
-void init_cookies()
-{
+void load_cookies() {
 	unsigned char in_buffer[MAX_STR_LEN];
 	unsigned char *cookfile, *p, *q;
 	FILE *fp;
+	struct cookie *c;
 
 	/* must be called after init_home */
 	if (! links_home) return;
@@ -287,6 +301,13 @@
 	if (! cookfile) return;
 	add_to_strn(&cookfile, "cookies");
 
+	/* do it here, as we will delete whole cookies list if the file was removed */
+	free_list(c_domains);
+
+	foreach(c, cookies)
+		free_cookie(c);
+	free_list(cookies);
+
 	fp = fopen(cookfile, "r");
 	mem_free(cookfile);
 	if (fp == NULL) return;
@@ -337,18 +358,17 @@
 
 inv:
 		free_cookie(cookie);
-		free(cookie);
+		mem_free(cookie);
 	}
 	fclose(fp);
 }
 
-void cleanup_cookies()
-{
+int cquit = 0; /* XXX */
+
+void save_cookies() {
 	struct cookie *c;
 	unsigned char *cookfile;
 	FILE *fp;
-	
-	free_list(c_domains);
 
 	cookfile = stracpy(links_home);
 	if (! cookfile) return;
@@ -364,11 +384,25 @@
 			    c->server?c->server:(unsigned char *)"", c->path?c->path:(unsigned char *)"",
 			    c->domain?c->domain:(unsigned char *)"", c->expires, c->secure);
 
-		free_cookie(c);
+		if (cquit)
+			free_cookie(c);
 	}
 
 	fclose(fp);
+}
+
+void init_cookies()
+{
+	load_cookies();
+}
+
+void cleanup_cookies()
+{
+	free_list(c_domains);
+	
+	cquit = 1;
+	save_cookies();
+	cquit = 0;
 	
 	free_list(cookies);
 }
-
diff -ru links-0.96/kbdbind.c links-0.96+cookies-resave/kbdbind.c
--- links-0.96/kbdbind.c	Tue Oct  2 14:24:38 2001
+++ links-0.96+cookies-resave/kbdbind.c	Tue Oct  2 14:40:40 2001
@@ -148,6 +148,7 @@
 		"back",
 		"backspace",
 		"bookmark-manager",
+		"cookies-load",
 		"copy-clipboard",
 		"cut-clipboard",
 		"delete",
@@ -336,6 +337,7 @@
 	{ ACT_ADD_BOOKMARK, 'A' },
 	{ ACT_BOOKMARK_MANAGER, 's' },
 	{ ACT_BOOKMARK_MANAGER, 'S' },
+	{ ACT_COOKIES_LOAD, 'K', KBD_CTRL },
 	{ ACT_QUIT, 'q' },
 	{ ACT_REALLYQUIT, 'Q' },
 	{ ACT_DOCUMENT_INFO, '=' },
diff -ru links-0.96/links.h links-0.96+cookies-resave/links.h
--- links-0.96/links.h	Tue Oct  2 14:24:38 2001
+++ links-0.96+cookies-resave/links.h	Tue Oct  2 14:41:36 2001
@@ -831,6 +831,7 @@
 
 int set_cookie(struct terminal *, unsigned char *, unsigned char *);
 void send_cookies(unsigned char **, int *, unsigned char *);
+void load_cookies();
 void init_cookies();
 void cleanup_cookies();
 
@@ -2118,6 +2119,7 @@
 	ACT_BACK,
 	ACT_BACKSPACE,
 	ACT_BOOKMARK_MANAGER,
+	ACT_COOKIES_LOAD,
 	ACT_COPY_CLIPBOARD,
 	ACT_CUT_CLIPBOARD,
 	ACT_DELETE,
diff -ru links-0.96/view.c links-0.96+cookies-resave/view.c
--- links-0.96/view.c	Tue Oct  2 14:24:38 2001
+++ links-0.96+cookies-resave/view.c	Tue Oct  2 14:43:25 2001
@@ -2089,6 +2089,9 @@
 			case ACT_BOOKMARK_MANAGER:
 				if (!anonymous) menu_bookmark_manager(ses->term, NULL, ses);
 				goto x;
+			case ACT_COOKIES_LOAD:
+				if (!anonymous) load_cookies();
+				goto x;
 			case ACT_REALLYQUIT:
 				reallyquit:
 				exit_prog(ses->term, (void *)1, ses);
