diff -Naur pan_orig/pan/action.c pan/pan/action.c
--- pan_orig/pan/action.c	2004-11-09 22:10:54.000000000 +0100
+++ pan/pan/action.c	2005-08-26 16:21:01.000000000 +0200
@@ -188,6 +188,10 @@
 			article_action_ignore_selected_threads ();
 			break;
 
+		case ACTION_OPEN_GOOGLE:
+			article_action_selected_open_google ();
+			break;
+
 		default:
 			pan_warn_if_reached ();
 			break;
diff -Naur pan_orig/pan/action.h pan/pan/action.h
--- pan_orig/pan/action.h	2003-11-27 04:40:13.000000000 +0100
+++ pan/pan/action.h	2005-08-26 16:21:01.000000000 +0200
@@ -53,6 +53,7 @@
 	ACTION_SCORE_WATCH_THREAD,
 	ACTION_SCORE_IGNORE_THREAD,
 	ACTION_SCORE_RESCORE,
+	ACTION_OPEN_GOOGLE,
 	ACTION_QTY
 }
 PanAction;
diff -Naur pan_orig/pan/article-actions.c pan/pan/article-actions.c
--- pan_orig/pan/article-actions.c	2005-03-09 21:15:57.000000000 +0100
+++ pan/pan/article-actions.c	2005-08-26 16:48:14.000000000 +0200
@@ -479,7 +479,7 @@
 		do_list[action].verb,
 		article_get_subject (article_get_root (article)));
 
-	/* if the article's Message-ID is the top article, 
+	/* if the article's Message-ID is the top article,
 	 * the article's Referencess contains the top article,
 	 * set the score to watch/ignore */
 
@@ -569,7 +569,7 @@
 {
 	header_pane_forall_active (header_pane_mark_articles_nolock, GINT_TO_POINTER(FALSE));
 }
-void 
+void
 article_action_mark_selected_read (void)
 {
 	header_pane_forall_active (header_pane_mark_articles_nolock, GINT_TO_POINTER(TRUE));
@@ -632,3 +632,31 @@
 {
 	header_pane_first_selected (supersede_article, NULL);
 }
+
+void
+article_action_selected_open_google (void)
+{
+
+	GSList * articles;
+
+	/* build the list of articles */
+	articles = NULL;
+	header_pane_foreach_selected (add_article_to_gslist, &articles);
+	articles = g_slist_reverse (articles);
+
+	/* if any articles are selected, open them in Google */
+	while(articles != NULL)
+	{
+		gchar *msgid = g_strdup (ARTICLE(articles->data)->message_id.str + 1);
+		gchar * url;
+
+		g_strdelimit (msgid, ">", '\0');
+		url = g_strconcat ("http://groups.google.com/groups?hl=de&selm=", msgid, NULL);
+		pan_url_show (url);
+		g_free (url);
+		g_free (msgid);
+
+		articles = articles->next;
+	}
+
+}
diff -Naur pan_orig/pan/article-actions.h pan/pan/article-actions.h
--- pan_orig/pan/article-actions.h	2004-11-09 22:10:54.000000000 +0100
+++ pan/pan/article-actions.h	2005-08-26 16:21:00.000000000 +0200
@@ -65,5 +65,6 @@
 
 void      article_action_supersede_selected          (void);
 
+void      article_action_selected_open_google		 (void);
 
 #endif
diff -Naur pan_orig/pan/articlelist.c pan/pan/articlelist.c
--- pan_orig/pan/articlelist.c	2005-03-12 19:07:09.000000000 +0100
+++ pan/pan/articlelist.c	2005-08-26 16:24:32.000000000 +0200
@@ -445,7 +445,7 @@
 select_these_articles (Article ** articles, guint article_qty, gpointer unused)
 {
 	guint i;
-	guint node_qty = 0; 
+	guint node_qty = 0;
 	GtkCTreeNode ** nodes = g_new (GtkCTreeNode*, article_qty);
 
 	for (i=0; i!=article_qty; ++i)
@@ -553,7 +553,7 @@
 	if (node == zeroth)
 		return gtk_ctree_node_nth (_article_ctree, row_qty-1);
 
-	/* get parent */	
+	/* get parent */
 	parent = GTK_CTREE_ROW(node)->parent;
 	if (!parent)
 		return NULL;
@@ -636,7 +636,7 @@
 			                           group_get_acache_key(article->group),
 			                           group_get_default_charset(article->group),
 			                           mids, parts->len);
-		
+
 			/* cleanup */
 			for (i=0; i<parts->len; ++i)
 				g_object_unref (mids[i]);
@@ -670,7 +670,7 @@
 {
 	guint i;
 	GPtrArray * a;
-       
+
 	a = g_ptr_array_sized_new (article_qty);
 	for (i=0; i!=article_qty; ++i)
 		if (articles[i]!=except_me && articles[i]->parts<2)
@@ -1403,7 +1403,7 @@
 		group_ref_articles (group, NULL);
 
 		/* push the rest of the work to the main thread */
-		g_idle_add (articles_removed_mainthread, 
+		g_idle_add (articles_removed_mainthread,
 		               argset_new2 (group, pan_g_ptr_array_dup(removed_articles_sorted_by_message_id)));
 	}
 }
@@ -1451,7 +1451,7 @@
 
 
 /* siblings get matched up to, as per the user's 'show' settings,
- * with one caveat: "don't show ignored articles" outweighs 
+ * with one caveat: "don't show ignored articles" outweighs
  * "show relatives". This way ignored articles must be explicitly
  * turned on in `match ignored articles' before they're shown. */
 static void
@@ -1769,7 +1769,7 @@
 ****
 ***/
 
-static void 
+static void
 articlelist_update_node_nolock (GtkCTreeNode   * node,
                                 const Article  * article)
 {
@@ -1958,7 +1958,7 @@
 /**
  * The following buttonpress, keypress, and selection callbacks are all here
  * to interact with each other to do one thing: force this damn GtkCTree to
- * have the UI behavior that we want, which is described in 
+ * have the UI behavior that we want, which is described in
  * articlelist_selection_changed()
  */
 
@@ -2115,7 +2115,7 @@
 }
 
 static gboolean select_callback_pending = FALSE;
- 
+
 static int
 tree_select_row_idle (gpointer data)
 {
@@ -2247,7 +2247,7 @@
 	gboolean my_group_removed;
 	const GPtrArray * groups;
 
-	/* setup */	
+	/* setup */
 	groups = (const GPtrArray*) groups_array;
 
 	/* was our group one of the ones removed? */
@@ -2555,6 +2555,7 @@
 	menu_set_sensitive (gif, "/Add Set to Selection", have_article);
 	menu_set_sensitive (gif, "/Copy to Folder", have_article);
 	menu_set_sensitive (gif, "/Delete", have_article);
+	menu_set_sensitive (gif, "/Read Article at Google", have_article);
 
 	gtk_menu_popup (GTK_MENU (threads_popup_menu),
 			NULL, NULL, NULL, NULL,
@@ -2567,10 +2568,11 @@
         const PanAction action = (PanAction) iaction;
         pan_action_do (action);
 }
-static int threads_popup_entries_qty = 20;
+static int threads_popup_entries_qty = 21;
 static GtkItemFactoryEntry threads_popup_entries[] =
 {
 	/* r */ {N_("/_Read Article"), NULL, articlelist_read_selected, 0, NULL},
+	/* g */ {N_("/Read Article at _Google"), NULL, menu_cb, ACTION_OPEN_GOOGLE, NULL},
 	/*   */ {N_("/---"), NULL, NULL, 0, "<Separator>"},
 	/* s */ {N_("/_Save Article As..."), NULL, menu_cb, ACTION_SAVE_AS, NULL},
 	/* t */ {N_("/Save Article A_ttachments"), NULL, menu_cb, ACTION_SAVE, NULL},
@@ -2660,7 +2662,7 @@
 	/* cleanup - done with status-item */
 	status_item_set_active (status, FALSE);
 	pan_object_unref (PAN_OBJECT(status));
-	
+
 	/* cleanup - free the tmp stuff */
 	g_ptr_array_free (articles, TRUE);
 	argset_free (argset);

