diff --git a/ChangeLog b/ChangeLog
index fea6d22cdd0796d13b23e5a12dc3614958ff922d..212b03bdd357235bf71531d61d1e42b9504e9468 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2008-04-18  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * Add command line option "--ignore-plugin" to start the stand-alone
+   application even if the panel plugin is loaded.
+ * Add new languages Chinese and Italian which are newly supported
+   by dict.leo.org.
+ * Rewrite of the web search code to be more flexible to use and to
+   simplify the code.
+   Add two other dictionary services:
+   Dictionary.com and TheFreeDictionary.com.
+
+
+2008-04-17  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * Unify application name to "Xfce4 Dictionary".
+ * Remove Help button from preferences dialog as there is no help
+   available at all.
+ * Disable conversion into ISO-8859-15 of search text when using
+   dict.leo.org, seems not necessary anymore.
+ * Fix problems with preferences dialog callback if panel plugin is
+   loaded.
+ * Fix minor panel button sizing issues (make it a little wider on
+   horizontal panel, a little flatter on vertical panels).
+
+
 2008-04-15  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * Update Readme.
diff --git a/lib/common.c b/lib/common.c
index b2076de1ee32a5944c8b797a2b9007d5b9eebd44..4f66d38a1895d9b18bdf0dc13079fd573a446ec9 100644
--- a/lib/common.c
+++ b/lib/common.c
@@ -43,7 +43,6 @@
 
 
 
-
 /* TODO make me UTF-8 safe */
 static gint str_pos(const gchar *haystack, const gchar *needle)
 {
@@ -163,58 +162,10 @@ gboolean dict_open_browser(DictData *dd, const gchar *uri)
 
 static gboolean start_web_query(DictData *dd, const gchar *word)
 {
-	gboolean use_leo = FALSE;
 	gboolean success = TRUE;
-	gchar *uri, *base;
+	gchar *uri;
 
-	switch (dd->web_mode)
-	{
-		case WEBMODE_LEO_GERENG:
-		{
-			base = "http://dict.leo.org/ende?search={word}";
-			use_leo = TRUE;
-			break;
-		}
-		case WEBMODE_LEO_GERFRE:
-		{
-			base = "http://dict.leo.org/frde?search={word}";
-			use_leo = TRUE;
-			break;
-		}
-		case WEBMODE_LEO_GERSPA:
-		{
-			base = "http://dict.leo.org/esde?search={word}";
-			use_leo = TRUE;
-			break;
-		}
-		case WEBMODE_LEO_GERITA:
-		{
-			base = "http://dict.leo.org/itde?search={word}";
-			use_leo = TRUE;
-			break;
-		}
-		case WEBMODE_LEO_GERCHI:
-		{
-			base = "http://dict.leo.org/chde?search={word}";
-			use_leo = TRUE;
-			break;
-		}
-		default: base = dd->web_url;
-	}
-#if 0 /* for some reason this isn't necessary anymore */
-	if (use_leo)
-	{
-		/* convert the text into ISO-8869-15 because dict.leo.org expects it ;-( */
-		gchar *tmp = g_convert(dd->searched_word, -1,
-								"ISO-8859-15", "UTF-8", NULL, NULL, NULL);
-		if (tmp != NULL)
-		{
-			g_free(dd->searched_word);
-			dd->searched_word = tmp;
-		}
-	}
-#endif
-	uri = str_replace(g_strdup(base), "{word}", dd->searched_word);
+	uri = str_replace(g_strdup(dd->web_url), "{word}", dd->searched_word);
 	if (! dict_open_browser(dd, uri))
 	{
 		xfce_err(_("Browser could not be opened. Please check your preferences."));
@@ -309,7 +260,6 @@ void dict_read_rc_file(DictData *dd)
 	XfceRc *rc;
 	gint mode_in_use = DICTMODE_DICT;
 	gint mode_default = DICTMODE_LAST_USED;
-	gint webmode = WEBMODE_LEO_GERENG;
 	gint port = 2628;
 	gint panel_entry_size = 120;
 	gboolean show_panel_entry = FALSE;
@@ -323,7 +273,6 @@ void dict_read_rc_file(DictData *dd)
 	{
 		mode_in_use = xfce_rc_read_int_entry(rc, "mode_in_use", mode_in_use);
 		mode_default = xfce_rc_read_int_entry(rc, "mode_default", mode_default);
-		webmode = xfce_rc_read_int_entry(rc, "web_mode", webmode);
 		weburl = xfce_rc_read_entry(rc, "web_url", weburl);
 		show_panel_entry = xfce_rc_read_bool_entry(rc, "show_panel_entry", show_panel_entry);
 		panel_entry_size = xfce_rc_read_int_entry(rc, "panel_entry_size", panel_entry_size);
@@ -342,7 +291,6 @@ void dict_read_rc_file(DictData *dd)
 	else
 		dd->mode_in_use = dd->mode_default;
 
-	dd->web_mode = webmode;
 	dd->web_url = g_strdup(weburl);
 	dd->show_panel_entry = show_panel_entry;
 	dd->panel_entry_size = panel_entry_size;
@@ -362,7 +310,6 @@ void dict_write_rc_file(DictData *dd)
 	{
 		xfce_rc_write_int_entry(rc, "mode_in_use", dd->mode_in_use);
 		xfce_rc_write_int_entry(rc, "mode_default", dd->mode_default);
-		xfce_rc_write_int_entry(rc, "web_mode", dd->web_mode);
 		if (dd->web_url != NULL)
 			xfce_rc_write_entry(rc, "web_url", dd->web_url);
 		xfce_rc_write_bool_entry(rc, "show_panel_entry", dd->show_panel_entry);
@@ -435,4 +382,3 @@ DictData *dict_create_dictdata()
 	return dd;
 }
 
-
diff --git a/lib/common.h b/lib/common.h
index bdf71f1b542f2b7876f1e6591b87199d786331ae..6950e9dd60eb25a9485ad8fc139649a08fd78dad 100644
--- a/lib/common.h
+++ b/lib/common.h
@@ -43,30 +43,17 @@ typedef enum
 	DICTMODE_LAST_USED
 } dict_mode_t;
 
-typedef enum
-{
-	WEBMODE_OTHER = 0,
-	WEBMODE_LEO_GERENG,
-	WEBMODE_LEO_GERFRE,
-	WEBMODE_LEO_GERSPA,
-	WEBMODE_LEO_GERITA,
-	WEBMODE_LEO_GERCHI
-} web_mode_t;
-
-
 enum
 {
 	NO_CONNECTION,
 	NO_ERROR
 };
 
-
 typedef struct
 {
 	/* settings */
 	dict_mode_t mode_in_use;
 	dict_mode_t mode_default;
-	web_mode_t web_mode;
 
 	gboolean show_panel_entry;
 	gint panel_entry_size;
@@ -100,8 +87,6 @@ typedef struct
 	GtkTextBuffer *main_textbuffer;
 	GtkTextTag *main_boldtag;
 	GdkPixbuf *icon;
-
-	GtkWidget *web_entry_box;
 } DictData;
 
 
diff --git a/lib/prefs.c b/lib/prefs.c
index 73b851b7b4e4ffb3e2061b0f989873d16976a735..b037b3c7dbed35124ddcc268ad96dd961aa596a3 100644
--- a/lib/prefs.c
+++ b/lib/prefs.c
@@ -30,6 +30,12 @@
 #include "dictd.h"
 
 
+typedef struct
+{
+	gchar *label;
+	gchar *url;
+} web_dict_t;
+
 
 static void show_panel_entry_toggled(GtkToggleButton *tb, DictData *dd)
 {
@@ -43,20 +49,6 @@ static void show_panel_entry_toggled(GtkToggleButton *tb, DictData *dd)
 }
 
 
-static void web_search_type_changed(GtkRadioButton *radiobutton, DictData *dd)
-{
-	if (! gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton)))
-		return; /* ignore the toggled event when a button is deselected */
-
-	dd->web_mode = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(radiobutton), "type"));
-
-	gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(dd->web_entry_box), "web_entry"),
-		(dd->web_mode == WEBMODE_OTHER));
-	gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(dd->web_entry_box), "web_entry_label"),
-		(dd->web_mode == WEBMODE_OTHER));
-}
-
-
 static void search_method_changed(GtkRadioButton *radiobutton, DictData *dd)
 {
 	if (! gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton)))
@@ -124,12 +116,9 @@ void dict_prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd)
 	dd->dictionary = tmp;
 
 	/* MODE WEB */
-	if (dd->web_mode == WEBMODE_OTHER)
-	{
-		g_free(dd->web_url);
-		dd->web_url = g_strdup(gtk_entry_get_text(
+	g_free(dd->web_url);
+	dd->web_url = g_strdup(gtk_entry_get_text(
 			GTK_ENTRY(g_object_get_data(G_OBJECT(dlg), "web_entry"))));
-	}
 
 	/* MODE SPELL */
 	tmp = gtk_combo_box_get_active_text(
@@ -159,13 +148,63 @@ void dict_prefs_dialog_response(GtkWidget *dlg, gint response, DictData *dd)
 }
 
 
+static void web_dict_button_clicked(GtkButton *button, gpointer user_data)
+{
+	const gchar *url = user_data;
+	GtkEntry *entry = g_object_get_data(G_OBJECT(button), "web_entry");
+
+	if (entry != NULL && url != NULL)
+		gtk_entry_set_text(entry, url);
+}
+
+
+static GtkWidget *create_web_dicts_table(GtkWidget *entry)
+{
+	gint i;
+	gint offset;
+	GtkWidget *table, *button;
+	static web_dict_t web_dicts[] =
+	{
+		{ N_("dict.leo.org - German <-> English"), "http://dict.leo.org/ende?search={word}" },
+		{ N_("dict.leo.org - German <-> French"), "http://dict.leo.org/frde?search={word}" },
+		{ N_("dict.leo.org - German <-> Spanish"), "http://dict.leo.org/esde?search={word}" },
+		{ N_("dict.leo.org - German <-> Italian"), "http://dict.leo.org/itde?search={word}" },
+		{ N_("dict.leo.org - German <-> Chinese"), "http://dict.leo.org/chde?search={word}" },
+		{ N_("Dictionary.com"), "http://dictionary.reference.com/search?db=dictionary&q={word}" },
+		{ N_("TheFreeDictionary.com"), "http://www.thefreedictionary.com/_/partner.aspx?Word={word}&Set=www&mode=w" },
+		{ N_("Clear"), "" },
+		{ NULL, NULL }
+	};
+
+	table = gtk_table_new(4, 2, FALSE);
+	gtk_table_set_row_spacings(GTK_TABLE(table), 2);
+	gtk_table_set_col_spacings(GTK_TABLE(table), 2);
+
+	for (i = 0; web_dicts[i].label != NULL; i++)
+	{
+		offset = i % 2;
+		button = gtk_button_new_with_label(web_dicts[i].label);
+		g_signal_connect(button, "clicked", G_CALLBACK(web_dict_button_clicked), web_dicts[i].url);
+		g_object_set_data(G_OBJECT(button), "web_entry", entry);
+		gtk_widget_show(button);
+
+		gtk_table_attach(GTK_TABLE(table),
+				button, offset, 1 + offset, i - offset, i + 1 - offset,
+				(GtkAttachOptions) (GTK_FILL | GTK_EXPAND),
+				(GtkAttachOptions) (0), 5, 5);
+	}
+
+	return table;
+}
+
+
 GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 {
 	GtkWidget *dialog, *inner_vbox, *notebook, *notebook_vbox;
 	GtkWidget *label1, *label2, *label3;
 
 	dialog = xfce_titled_dialog_new_with_buttons(
-		_("Xfce Dictionary"), GTK_WINDOW(parent),
+		_("Xfce4 Dictionary"), GTK_WINDOW(parent),
 		GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
 		GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
 		NULL);
@@ -183,7 +222,7 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 	/*
 	 * Page: general
 	 */
-#define PAGE_GENERAL /* only navigation in Geany's symbol list ;-) */
+#define PAGE_GENERAL /* only for navigation in Geany's symbol list ;-) */
 	{
 		GtkWidget *radio_button, *label;
 		GSList *search_method;
@@ -286,7 +325,7 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 	/*
 	 * Page: DICTD
 	 */
-#define PAGE_DICTD /* only navigation in Geany's symbol list ;-) */
+#define PAGE_DICTD /* only for navigation in Geany's symbol list ;-) */
 	 {
 		GtkWidget *table, *button_get_list, *server_entry, *port_spinner, *dict_combo;
 
@@ -393,10 +432,9 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 	/*
 	 * Page: WEB
 	 */
-#define PAGE_WEB /* only navigation in Geany's symbol list ;-) */
+#define PAGE_WEB /* only for navigation in Geany's symbol list ;-) */
 	{
-		GtkWidget *radio_button, *label, *web_entry_label, *web_entry;
-		GSList *web_type;
+		GtkWidget *label, *web_entry_label, *web_entry, *web_entry_box, *web_dicts_table;
 
 		notebook_vbox = gtk_vbox_new(FALSE, 5);
 		gtk_widget_show(notebook_vbox);
@@ -410,65 +448,6 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 		gtk_widget_show(label);
 		gtk_box_pack_start(GTK_BOX(inner_vbox), label, FALSE, FALSE, 0);
 
-		radio_button = gtk_radio_button_new_with_label(NULL,
-							_("dict.leo.org - German <-> English"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_LEO_GERENG)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERENG));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
-		radio_button = gtk_radio_button_new_with_label(web_type,
-							_("dict.leo.org - German <-> French"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_LEO_GERFRE)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERFRE));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
-		radio_button = gtk_radio_button_new_with_label(web_type,
-							_("dict.leo.org - German <-> Spanish"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_LEO_GERSPA)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERSPA));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
-		radio_button = gtk_radio_button_new_with_label(web_type,
-							_("dict.leo.org - German <-> Italian"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_LEO_GERITA)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERITA));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
-		radio_button = gtk_radio_button_new_with_label(web_type,
-							_("dict.leo.org - German <-> Chinese"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_LEO_GERCHI)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_LEO_GERCHI));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
-		radio_button = gtk_radio_button_new_with_label(web_type, _("Use another website"));
-		web_type = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
-		if (dd->web_mode == WEBMODE_OTHER)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
-		gtk_widget_show(radio_button);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), radio_button, FALSE, FALSE, 0);
-		g_object_set_data(G_OBJECT(radio_button), "type", GINT_TO_POINTER(WEBMODE_OTHER));
-		g_signal_connect(G_OBJECT(radio_button), "toggled", G_CALLBACK(web_search_type_changed), dd);
-
 		web_entry_label = gtk_label_new_with_mnemonic(_("URL:"));
 		gtk_widget_show(web_entry_label);
 		web_entry = gtk_entry_new();
@@ -476,31 +455,31 @@ GtkWidget *dict_prefs_dialog_show(GtkWidget *parent, DictData *dd)
 			gtk_entry_set_text(GTK_ENTRY(web_entry), dd->web_url);
 		gtk_widget_show(web_entry);
 
-		dd->web_entry_box = gtk_hbox_new(FALSE, 0);
-		gtk_widget_show(dd->web_entry_box);
-		gtk_box_pack_start(GTK_BOX(dd->web_entry_box), web_entry_label, FALSE, TRUE, 5);
-		gtk_box_pack_start(GTK_BOX(dd->web_entry_box), web_entry, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(inner_vbox), dd->web_entry_box, FALSE, FALSE, 0);
+		web_entry_box = gtk_hbox_new(FALSE, 0);
+		gtk_widget_show(web_entry_box);
+
+		web_dicts_table = create_web_dicts_table(web_entry);
+		gtk_widget_show(web_dicts_table);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), web_dicts_table, FALSE, FALSE, 0);
+
+		gtk_box_pack_start(GTK_BOX(web_entry_box), web_entry_label, FALSE, TRUE, 5);
+		gtk_box_pack_start(GTK_BOX(web_entry_box), web_entry, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(inner_vbox), web_entry_box, FALSE, FALSE, 0);
 
 		g_object_set_data(G_OBJECT(dialog), "web_entry", web_entry);
-		g_object_set_data(G_OBJECT(dd->web_entry_box), "web_entry", web_entry);
-		g_object_set_data(G_OBJECT(dd->web_entry_box), "web_entry_label", web_entry_label);
 
-		label1 = gtk_label_new(_("Enter an URL to a web site which offer translation services.\nUse {word} as placeholder for the searched word."));
+		label1 = gtk_label_new(_("Enter an URL to a web site which offer translation or dictionary services.\nUse {word} as placeholder for the searched word."));
 		gtk_label_set_line_wrap(GTK_LABEL(label1), TRUE);
 		gtk_misc_set_alignment(GTK_MISC(label1), 0, 0);
 		gtk_widget_show(label1);
 		gtk_box_pack_start(GTK_BOX(inner_vbox), label1, FALSE, FALSE, 0);
 		gtk_box_pack_start(GTK_BOX(notebook_vbox), inner_vbox, TRUE, TRUE, 5);
-
-		/* init the sensitive widgets */
-		web_search_type_changed(GTK_RADIO_BUTTON(radio_button), dd);
 	}
 
 	/*
 	 * Page: ASPELL
 	 */
-#define PAGE_ASPELL /* only navigation in Geany's symbol list ;-) */
+#define PAGE_ASPELL /* only for navigation in Geany's symbol list ;-) */
 	{
 		GtkWidget *table, *spell_entry, *spell_combo;