diff -pru dillo-0.7.3/src/browser.h dillo-0.7.3m/src/browser.h
--- dillo-0.7.3/src/browser.h	Tue Aug 19 07:59:47 2003
+++ dillo-0.7.3m/src/browser.h	Sat Aug  9 12:22:52 2003
@@ -144,6 +144,7 @@ struct _DilloDoc
 
    /* This is the main document widget. (HTML rendering or whatever) */
    GtkWidget *docwin;
+   GtkWidget *socket;
 
    /* The "Headings" and "Anchors" menus */
    GtkWidget *pagemarks_menu;
diff -pru dillo-0.7.3/src/commands.c dillo-0.7.3m/src/commands.c
--- dillo-0.7.3/src/commands.c	Tue Aug 19 08:31:03 2003
+++ dillo-0.7.3m/src/commands.c	Thu Aug 14 23:10:07 2003
@@ -438,6 +438,28 @@ void a_Commands_save_callback(GtkWidget 
    a_Interface_save_dialog(widget, bw);
 }
 
+extern void Tab_label_button_press_event_callback(GtkWidget *widget,
+                                      GdkEventButton *event,
+                                      gpointer client_data);
+extern void
+Tab_label_size_request_callback(GtkWidget *widget,
+                                GtkAllocation *alloc,
+                                gpointer client_data);
+
+/*
+ * Add a tab (containing an external Gtk program socket) to a browser window
+ */
+void a_Commands_addXGtkTab_callback(GtkWidget *widget, gpointer client_data)
+{
+   BrowserWindow *bw = (BrowserWindow *)client_data;
+   DilloDoc *newdd;
+   Selection = g_strdup(URL_STR(bw->menu_popup.url));
+
+   newdd = a_Doc_new();
+   a_Tab_add(bw, newdd, TRUE, "gdx", Selection);
+
+   g_free(Selection);
+}
 
 /*
  * Bring up the save link dialog
@@ -611,7 +633,7 @@ void a_Commands_open_link_nw_tab_callbac
    DilloDoc *newdd;
 
    newdd = a_Doc_new();
-   a_Tab_add(bw, newdd);
+   a_Tab_add(bw, newdd, FALSE, NULL, NULL);
 
    if(prefs.tab_load_in_background)
      /* irritating Gdk-CRITICAL warning here from widget */
diff -pru dillo-0.7.3/src/commands.h dillo-0.7.3m/src/commands.h
--- dillo-0.7.3/src/commands.h	Tue Aug 19 08:10:37 2003
+++ dillo-0.7.3m/src/commands.h	Thu Aug 14 23:05:41 2003
@@ -31,6 +31,7 @@ void a_Commands_toglcolor_callback (GtkW
 void a_Commands_stop_callback (GtkWidget *widget, gpointer client_data);
 void a_Commands_home_callback (GtkWidget *widget, gpointer client_data);
 void a_Commands_save_callback (GtkWidget *widget, gpointer client_data);
+void a_Commands_addXGtkTab_callback(GtkWidget *widget, gpointer client_data);
 void a_Commands_save_doc_callback (GtkWidget *widget, gpointer client_data);
 void a_Commands_save_link_callback (GtkWidget *widget, gpointer client_data);
 void a_Commands_addbm_callback (GtkWidget *widget, gpointer client_data);
diff -pru dillo-0.7.3/src/menu.c dillo-0.7.3m/src/menu.c
--- dillo-0.7.3/src/menu.c	Tue Aug 19 08:28:59 2003
+++ dillo-0.7.3m/src/menu.c	Thu Aug 14 23:06:20 2003
@@ -433,6 +433,9 @@ GtkWidget *a_Menu_popup_ol_new(BrowserWi
    Menu_add(menu, "       LINK OPTIONS", NULL, bw, NULL, NULL);
    Menu_sep(menu);
 #ifndef DISABLE_TABS
+   Menu_add(menu, "Edit:", NULL, bw,
+	    a_Commands_addXGtkTab_callback, bw);
+
    Menu_add(menu, "Open Link in New Tab", NULL, bw,
             a_Commands_open_link_nw_tab_callback, bw);
 #endif /* !DISABLE_TABS */
diff -pru dillo-0.7.3/src/tab.c dillo-0.7.3m/src/tab.c
--- dillo-0.7.3/src/tab.c	Tue Aug 19 07:59:47 2003
+++ dillo-0.7.3m/src/tab.c	Thu Aug 14 22:51:13 2003
@@ -36,6 +36,7 @@
 #include "dw_gtk_viewport.h"
 
 #include <gdk/gdkkeysyms.h>
+#include <gdk/gdkx.h>
 
 #define DEBUG_EVENT  0
 #define DEBUG_SIZE  10
@@ -373,7 +374,7 @@ a_Tab_new(BrowserWindow *bw)
    g_return_if_fail (bw != NULL);
 
    dd = a_Doc_new();
-   a_Tab_add(bw, dd);
+   a_Tab_add(bw, dd, FALSE, NULL, NULL);
 
    /* always show new tabs, even when background loading */
    a_Tab_switch(dd);
@@ -387,22 +388,36 @@ a_Tab_new(BrowserWindow *bw)
  * Add a tab (containing an existing DilloDoc) to a browser window
  */
 void
-a_Tab_add(BrowserWindow *bw, DilloDoc *dd)
+a_Tab_add(BrowserWindow *bw, DilloDoc *dd, 
+           gboolean USE_SOCKET, 
+           char* CmdEx,
+           char* Target
+           )
 {
    GString *tab_title;
    GtkWidget *tab_label, *tab_label_event_box, *box;
    GtkPackType *pack_type = g_new0(GtkPackType, 1);
+   char cmdstr[256] = "";
+   char* uri = "";
 
    g_return_if_fail (bw != NULL && dd != NULL);
 
+   if(USE_SOCKET){
+      dd->socket = gtk_socket_new();
+      gtk_widget_show(dd->socket);
+   }
+
    a_Doc_set_browserwindow(dd, bw);
 
-   if (dd->nav_stack_ptr != -1)
-     {
-       tab_title = g_string_new(a_History_get_title(NAV_TOP(dd)));
-     } else {
-       tab_title = g_string_new("(Untitled)");
-     }
+   if(USE_SOCKET){
+      tab_title = g_string_new(Target);
+      uri = tab_title->str;
+   } else {
+      if (dd->nav_stack_ptr != -1)
+         tab_title = g_string_new(a_History_get_title(NAV_TOP(dd)));
+      else
+         tab_title = g_string_new("(Untitled)");
+   }
    
    tab_label_event_box = gtk_event_box_new();
    tab_label = gtk_label_new(tab_title->str);
@@ -410,7 +425,20 @@ a_Tab_add(BrowserWindow *bw, DilloDoc *d
    gtk_container_add(GTK_CONTAINER(tab_label_event_box), tab_label);
    box = gtk_hbox_new(TRUE, 0);
    gtk_container_set_border_width(GTK_CONTAINER(box), 0);
-   gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(dd->docwin), TRUE, TRUE, 0);
+
+   if(USE_SOCKET){
+      gtk_container_add(GTK_CONTAINER(box), dd->docwin);
+      // hide non-displaying docwin
+      gtk_widget_hide(dd->docwin);
+      gtk_container_add(GTK_CONTAINER(box), dd->socket);
+   } else {
+      gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(dd->docwin), TRUE, TRUE, 0);
+#ifdef XHTML_DTD_FRAMESET
+      if(dd->frameset)
+        gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(dd->frameset), TRUE, TRUE, 0);
+#endif /* XHTML_DTD_FRAMESET */
+   }
+
    gtk_widget_show(box);
    gtk_notebook_append_page(GTK_NOTEBOOK(bw->container), box, tab_label_event_box);
 
@@ -435,11 +463,31 @@ a_Tab_add(BrowserWindow *bw, DilloDoc *d
                       GTK_SIGNAL_FUNC(Tab_label_button_press_event_callback),
                       (gpointer) dd);
 
-   g_string_free(tab_title, TRUE);
    gtk_notebook_query_tab_label_packing(GTK_NOTEBOOK(bw->container), GTK_WIDGET(dd->docwin)->parent, NULL, NULL, pack_type);
    gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(bw->container), GTK_WIDGET(dd->docwin)->parent, TRUE, TRUE, *pack_type);
    g_free(pack_type);
    a_Tab_visibility_update(bw);
+
+   if(USE_SOCKET){
+      pid_t pid;
+      a_Tab_switch(dd); // needed here to set dd->socket->window
+
+      // Compose a command string for SYSTEM()
+	  if (!strncmp(uri, "file:",5)) uri += 5;
+	  sprintf(cmdstr,"%s -x %u %s", CmdEx,(gint) GDK_WINDOW_XWINDOW(dd->socket->window), uri);
+//	  printf ("Executing cmdstr:'%s'\n",(cmdstr));
+
+      // invoke a suitably modified external Gtk app with '-x <XID>' option
+      switch(pid=fork()) {
+         case 0:
+            execl("/bin/sh","sh","-c",cmdstr,(char *) 0);
+            fprintf(stderr,"System Error: Execl failed!");
+            _exit(127);
+         case -1: perror("fork");
+         default:;
+      }
+   }
+   g_string_free(tab_title, TRUE);
 }
 
 
diff -pru dillo-0.7.3/src/tab.h dillo-0.7.3m/src/tab.h
--- dillo-0.7.3/src/tab.h	Tue Aug 19 07:59:47 2003
+++ dillo-0.7.3m/src/tab.h	Thu Aug 14 22:48:09 2003
@@ -13,7 +13,7 @@ GtkContainer *
 a_Tab_browser_new(BrowserWindow *bw);
 void a_Tab_new(BrowserWindow *bw);
 void a_Tab_close(DilloDoc *dd);
-void a_Tab_add(BrowserWindow *bw, DilloDoc *dd);
+void a_Tab_add(BrowserWindow *bw, DilloDoc *dd, gboolean USE_SOCKET, char* CmdEx, char* Target);
 void a_Tab_switch(DilloDoc *dd);
 void a_Tab_title_set(DilloDoc *dd, gchar *title);
 void a_Tab_visibility_update(BrowserWindow *bw);
