diff -u -r links-0.96-orig/default.c links-0.96/default.c
--- links-0.96-orig/default.c	Sun Apr  8 22:46:18 2001
+++ links-0.96/default.c	Wed Aug 29 09:48:33 2001
@@ -854,6 +854,9 @@
 unsigned char http_proxy[MAX_STR_LEN] = "";
 unsigned char ftp_proxy[MAX_STR_LEN] = "";
 
+unsigned char fake_referer[MAX_STR_LEN] = "";
+int referer;   /* values: REFERER_NONE (default), REFERER_SAME_URL, REFERER_FAKE */
+
 unsigned char download_dir[MAX_STR_LEN] = "";
 
 unsigned char default_anon_pass[MAX_STR_LEN] = "somebody@host.domain";
@@ -896,6 +899,8 @@
 	1, gen_cmd, num_rd, num_wr, 0, 1, &http_bugs.allow_blacklist, "http_bugs.allow_blacklist", "http-bugs.allow-blacklist",
 	1, gen_cmd, num_rd, num_wr, 0, 1, &http_bugs.bug_302_redirect, "http_bugs.bug_302_redirect", "http-bugs.bug-302-redirect",
 	1, gen_cmd, num_rd, num_wr, 0, 1, &http_bugs.bug_post_no_keepalive, "http_bugs.bug_post_no_keepalive", "http-bugs.bug_post-no-keepalive",
+	1, gen_cmd, num_rd, num_wr, 0, 2, &referer, "http_referer", "http-referer",
+	1, gen_cmd, str_rd, str_wr, 0, MAX_STR_LEN, fake_referer, "fake_referer", "fake-referer",
 	1, gen_cmd, str_rd, str_wr, 0, MAX_STR_LEN, default_anon_pass, "ftp.anonymous_password", "ftp.anonymous-password",
 	1, gen_cmd, cp_rd, NULL, 0, 0, &dds.assume_cp, "assume_codepage", "assume-codepage",
 	1, NULL, term_rd, term_wr, 0, 0, NULL, "terminal", NULL,
diff -u -r links-0.96-orig/http.c links-0.96/http.c
--- links-0.96-orig/http.c	Mon Jun 18 21:59:55 2001
+++ links-0.96/http.c	Wed Aug 29 09:48:33 2001
@@ -241,6 +241,23 @@
 	add_to_str(&hdr, &l, "User-Agent: Links (" VERSION_STRING "; ");
 	add_to_str(&hdr, &l, system_name);
 	add_to_str(&hdr, &l, ")\r\n");
+
+	switch (referer)
+	{
+		case REFERER_FAKE:
+		add_to_str(&hdr, &l, "Referer: ");
+		add_to_str(&hdr, &l, fake_referer);
+		add_to_str(&hdr, &l, "\r\n");
+		break;
+		
+		case REFERER_SAME_URL:
+		add_to_str(&hdr, &l, "Referer: ");
+		if (!post) add_to_str(&hdr, &l, u);
+		else add_bytes_to_str(&hdr, &l, u, post - u - 1);
+		add_to_str(&hdr, &l, "\r\n");
+		break;
+	}
+
 	add_to_str(&hdr, &l, "Accept: */*\r\n");
 	if (!(accept_charset)) {
 		int i;
diff -u -r links-0.96-orig/intl/english.lng links-0.96/intl/english.lng
--- links-0.96-orig/intl/english.lng	Mon Jun 11 12:00:52 2001
+++ links-0.96/intl/english.lng	Wed Aug 29 09:48:33 2001
@@ -138,6 +138,10 @@
 T_CANT_GET_SOCKET_STATE, "Can't get socket state",
 T_BAD_HTTP_RESPONSE, "Bad HTTP response",
 T_HTTP_100, "HTTP 100 (???)",
+T_FAKE_REFERER, "Fixed HTTP Referer",
+T_REFERER_NONE, "No referer",
+T_REFERER_SAME_URL, "Send requested URL as referer",
+T_REFERER_FAKE, "Fixed referer",
 T_NO_CONTENT, "No content",
 T_UNKNOWN_FILE_TYPE, "Unknown file type",
 T_ERROR_OPENING_FILE, "Error opening file",
diff -u -r links-0.96-orig/links.h links-0.96/links.h
--- links-0.96-orig/links.h	Mon Jun 11 12:14:25 2001
+++ links-0.96/links.h	Wed Aug 29 09:48:34 2001
@@ -1988,8 +1988,14 @@
 extern struct rgb default_link;
 extern struct rgb default_vlink;
 
+#define REFERER_NONE 0
+#define REFERER_SAME_URL 1
+#define REFERER_FAKE 2
+
 extern unsigned char http_proxy[];
 extern unsigned char ftp_proxy[];
+extern unsigned char fake_referer[];
+extern int referer;
 extern unsigned char no_proxy_for[];
 extern unsigned char download_dir[];
 
diff -u -r links-0.96-orig/menu.c links-0.96/menu.c
--- links-0.96-orig/menu.c	Wed Apr 25 23:08:28 2001
+++ links-0.96/menu.c	Wed Aug 29 09:44:57 2001
@@ -438,16 +438,54 @@
  	do_dialog(term, d, getml(d, NULL));
 }
 
-unsigned char *http_labels[] = { TEXT(T_USE_HTTP_10), TEXT(T_ALLOW_SERVER_BLACKLIST), TEXT(T_BROKEN_302_REDIRECT), TEXT(T_NO_KEEPALIVE_AFTER_POST_REQUEST) };
+unsigned char *http_labels[] = { TEXT(T_USE_HTTP_10), TEXT(T_ALLOW_SERVER_BLACKLIST), TEXT(T_BROKEN_302_REDIRECT), TEXT(T_NO_KEEPALIVE_AFTER_POST_REQUEST), TEXT(T_REFERER_NONE), TEXT(T_REFERER_SAME_URL), TEXT(T_REFERER_FAKE), TEXT(T_FAKE_REFERER) };
+
+void httpopt_fn(struct dialog_data *dlg)
+{
+	struct terminal *term = dlg->win->term;
+	int max = 0, min = 0;
+	int w, rw;
+	int y = 0;
+	checkboxes_width(term, dlg->dlg->udata, &max, max_text_width);
+	checkboxes_width(term, dlg->dlg->udata, &min, min_text_width);
+	max_text_width(term, http_labels[7], &max);
+	min_text_width(term, http_labels[7], &min);
+	max_buttons_width(term, dlg->items + dlg->n - 2, 2, &max);
+	min_buttons_width(term, dlg->items + dlg->n - 2, 2, &min);
+	w = term->x * 9 / 10 - 2 * DIALOG_LB;
+	if (w > max) w = max;
+	if (w < min) w = min;
+	if (w > term->x - 2 * DIALOG_LB) w = term->x - 2 * DIALOG_LB;
+	if (w < 5) w = 5;
+	rw = 0;
+	dlg_format_checkboxes(NULL, term, dlg->items, dlg->n - 3, 0, &y, w, &rw, dlg->dlg->udata);
+	y++;
+	dlg_format_text(NULL, term, http_labels[7], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT);
+	y+=2;
+	dlg_format_buttons(NULL, term, dlg->items + dlg->n - 2, 2, 0, &y, w, &rw, AL_CENTER);
+	w = rw;
+	dlg->xw = rw + 2 * DIALOG_LB;
+	dlg->yw = y + 2 * DIALOG_TB;
+	center_dlg(dlg);
+	draw_dlg(dlg);
+	y = dlg->y + DIALOG_TB + 1;
+	dlg_format_checkboxes(term, term, dlg->items, dlg->n - 3, dlg->x + DIALOG_LB, &y, w, NULL, dlg->dlg->udata);
+	y++;
+	dlg_format_text(term, term, http_labels[7], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT);
+	dlg_format_field(term, term, dlg->items + 7, dlg->x + DIALOG_LB, &y, w, NULL, AL_LEFT);
+	y++;
+	dlg_format_buttons(term, term, dlg->items + dlg->n - 2, 2, dlg->x + DIALOG_LB, &y, w, &rw, AL_CENTER);
+}
+
 
 int dlg_http_options(struct dialog_data *dlg, struct dialog_item_data *di)
 {
 	struct http_bugs *bugs = (struct http_bugs *)di->cdata;
 	struct dialog *d;
-	if (!(d = mem_alloc(sizeof(struct dialog) + 7 * sizeof(struct dialog_item)))) return 0;
-	memset(d, 0, sizeof(struct dialog) + 7 * sizeof(struct dialog_item));
+	if (!(d = mem_alloc(sizeof(struct dialog) + 11 * sizeof(struct dialog_item)))) return 0;
+	memset(d, 0, sizeof(struct dialog) + 11 * sizeof(struct dialog_item));
 	d->title = TEXT(T_HTTP_BUG_WORKAROUNDS);
-	d->fn = checkbox_list_fn;
+	d->fn = httpopt_fn;
 	d->udata = http_labels;
 	d->items[0].type = D_CHECKBOX;
 	d->items[0].gid = 0;
@@ -465,15 +503,33 @@
 	d->items[3].gid = 0;
 	d->items[3].dlen = sizeof(int);
 	d->items[3].data = (void *)&bugs->bug_post_no_keepalive;
-	d->items[4].type = D_BUTTON;
-	d->items[4].gid = B_ENTER;
-	d->items[4].fn = ok_dialog;
-	d->items[4].text = TEXT(T_OK);
-	d->items[5].type = D_BUTTON;
-	d->items[5].gid = B_ESC;
-	d->items[5].fn = cancel_dialog;
-	d->items[5].text = TEXT(T_CANCEL);
-	d->items[6].type = D_END;
+	d->items[4].type = D_CHECKBOX;
+	d->items[4].gid = 1;
+	d->items[4].gnum = REFERER_NONE;
+	d->items[4].dlen = sizeof(int);
+	d->items[4].data = (void *)&referer;
+	d->items[5].type = D_CHECKBOX;
+	d->items[5].gid = 1;
+	d->items[5].gnum = REFERER_SAME_URL;
+	d->items[5].dlen = sizeof(int);
+	d->items[5].data = (void *)&referer;
+	d->items[6].type = D_CHECKBOX;
+	d->items[6].gid = 1;
+	d->items[6].gnum = REFERER_FAKE;
+	d->items[6].dlen = sizeof(int);
+	d->items[6].data = (void *)&referer;
+	d->items[7].type = D_FIELD;
+	d->items[7].dlen = MAX_STR_LEN;
+	d->items[7].data = fake_referer;
+	d->items[8].type = D_BUTTON;
+	d->items[8].gid = B_ENTER;
+	d->items[8].fn = ok_dialog;
+	d->items[8].text = TEXT(T_OK);
+	d->items[9].type = D_BUTTON;
+	d->items[9].gid = B_ESC;
+	d->items[9].fn = cancel_dialog;
+	d->items[9].text = TEXT(T_CANCEL);
+	d->items[10].type = D_END;
  	do_dialog(dlg->win->term, d, getml(d, NULL));
 	return 0;
 }
