diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/aligned-widget.c panel/gnome-core-1.4.0.8/panel/aligned-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/aligned-widget.c	Sun Apr 28 14:45:55 2002
+++ panel/gnome-core-1.4.0.8/panel/aligned-widget.c	Fri May  3 20:11:12 2002
@@ -285,6 +285,7 @@
 void
 aligned_widget_change_params (AlignedWidget *aligned,
 			      int screen,
+			      gboolean span_screens,
 			      AlignedAlignment align,
 			      BorderEdge edge,
 			      int sz,
@@ -312,6 +313,7 @@
 
 	border_widget_change_params (BORDER_WIDGET (aligned),
 				     screen,
+				     span_screens,
 				     edge,
 				     sz,
 				     mode,
@@ -342,6 +344,7 @@
 
 	aligned_widget_change_params (aligned,
 				      basep->screen,
+				      basep->span_screens,
 				      align,
 				      BORDER_POS (pos)->edge,
 				      panel->sz, basep->mode,
@@ -368,6 +371,7 @@
 
 	aligned_widget_change_params (aligned,
 				      basep->screen,
+				      basep->span_screens,
 				      align,
 				      edge,
 				      panel->sz,
@@ -387,6 +391,7 @@
 				 
 GtkWidget *
 aligned_widget_new (int screen,
+		    gboolean span_screens,
 		    AlignedAlignment align,
 		    BorderEdge edge,
 		    BasePMode mode,
@@ -411,6 +416,7 @@
 
 	border_widget_construct (BORDER_WIDGET (aligned),
 				 screen,
+				 span_screens,
 				 edge, 
 				 TRUE,
 				 FALSE,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/aligned-widget.h panel/gnome-core-1.4.0.8/panel/aligned-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/aligned-widget.h	Sun Apr 28 14:45:55 2002
+++ panel/gnome-core-1.4.0.8/panel/aligned-widget.h	Fri May  3 20:11:12 2002
@@ -53,6 +53,7 @@
 
 GtkType aligned_pos_get_type (void) G_GNUC_CONST;
 GtkWidget *aligned_widget_new (int screen,
+			       gboolean span_screens,
 			       AlignedAlignment aligned,
 			       BorderEdge edge,
 			       BasePMode mode,
@@ -71,6 +72,7 @@
 
 void aligned_widget_change_params (AlignedWidget *alignedw,
 				   int screen,
+				   gboolean span_screens,
 				   AlignedAlignment align,
 				   BorderEdge edge,
 				   int sz,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/basep-widget.c panel/gnome-core-1.4.0.8/panel/basep-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/basep-widget.c	Sun Apr 28 14:45:55 2002
+++ panel/gnome-core-1.4.0.8/panel/basep-widget.c	Fri May  3 22:05:12 2002
@@ -90,6 +90,7 @@
 	MODE_CHANGE_SIGNAL,
 	STATE_CHANGE_SIGNAL,
 	SCREEN_CHANGE_SIGNAL,
+	SPAN_SCREENS_CHANGE_SIGNAL,
 	WIDGET_LAST_SIGNAL
 };
 
@@ -268,27 +269,37 @@
 	}
 
 	if (basep->keep_in_screen) {
-		gint16 max;
+		gint16 min, max;
 
-		max = multiscreen_width (basep->screen) -
-			allocation->width +
-			multiscreen_x (basep->screen);
-
-		if (allocation->x < multiscreen_x (basep->screen))
-			allocation->x = multiscreen_x (basep->screen);
+		if (basep->span_screens) {
+			min = 0;
+			max = gdk_screen_width () - allocation->width;
+		}
+		else {
+			min = multiscreen_x (basep->screen);
+			max = multiscreen_width (basep->screen) -
+				allocation->width +
+				multiscreen_x (basep->screen);
+		}
+		if (allocation->x < min)
+			allocation->x = min;
 		else if (allocation->x > max)
 			allocation->x = max;
 
-
-		max = multiscreen_height (basep->screen) -
-			allocation->height +
-			multiscreen_y (basep->screen);
-
-		if (allocation->y < multiscreen_y (basep->screen))
-			allocation->y = multiscreen_y (basep->screen);
+		if (basep->span_screens) {
+			min = 0;
+			max = gdk_screen_height () - allocation->height;
+		}
+		else {
+			min = multiscreen_y (basep->screen);
+			max = multiscreen_height (basep->screen) -
+				allocation->height +
+				multiscreen_y (basep->screen);
+		}
+		if (allocation->y < min)
+			allocation->y = min;
 		else if (allocation->y > max)
 			allocation->y = max;
-				       
 	}
 	widget->allocation = *allocation;
 
@@ -318,6 +329,21 @@
 }
 
 static void
+basep_widget_real_span_screens_change (BasePWidget *basep,
+				       gboolean span_screens)
+{
+	if (basep->span_screens != span_screens) {
+		basep_border_queue_recalc (basep->screen);
+		basep->span_screens = span_screens;
+		/* this will queue border recalc in the new screen */
+		gtk_widget_queue_resize (GTK_WIDGET (basep));
+		panels_to_sync = TRUE;
+
+		update_config_span_screens (basep);
+	}
+}
+
+static void
 basep_widget_real_screen_change (BasePWidget *basep, int screen)
 {
 	if (basep->screen != screen) {
@@ -380,6 +406,17 @@
 			       1,
 			       GTK_TYPE_INT);
 
+	basep_widget_signals[SPAN_SCREENS_CHANGE_SIGNAL] = 
+		gtk_signal_new("span_screens_change",
+			       GTK_RUN_LAST,
+			       object_class->type,
+			       GTK_SIGNAL_OFFSET(BasePWidgetClass,
+						 span_screens_change),
+			       gtk_marshal_NONE__BOOL,
+			       GTK_TYPE_NONE,
+			       1,
+			       GTK_TYPE_BOOL);
+
 	gtk_object_class_add_signals(object_class, 
 				     basep_widget_signals,
 				     WIDGET_LAST_SIGNAL);
@@ -387,6 +424,7 @@
 	klass->mode_change = basep_widget_mode_change;
 	klass->state_change = basep_widget_state_change;
 	klass->screen_change = basep_widget_real_screen_change;
+	klass->span_screens_change = basep_widget_real_span_screens_change;
 
 	widget_class->size_request = basep_widget_size_request;
 	widget_class->size_allocate = basep_widget_size_allocate;
@@ -1293,6 +1331,7 @@
 			gboolean packed,
 			gboolean reverse_arrows,
 			int screen,
+			gboolean span_screens,
 			PanelOrientation orient,
 			int sz,
 			BasePMode mode,
@@ -1389,6 +1428,7 @@
 			    basep);
 
 	basep->screen = screen;
+	basep->span_screens = span_screens;
 
 	basep->level = level;
 	basep->avoid_on_maximize = avoid_on_maximize;
@@ -1420,6 +1460,7 @@
 void
 basep_widget_change_params (BasePWidget *basep,
 			    int screen,
+			    gboolean span_screens,
 			    PanelOrientation orient,
 			    int sz,
 			    BasePMode mode,
@@ -1496,6 +1537,7 @@
 	basep_widget_show_hidebutton_pixmaps (basep);
 
 	basep_widget_screen_change (basep, screen);
+	basep_widget_span_screens_change (basep, span_screens);
 
 	gtk_widget_queue_resize (GTK_WIDGET (basep));
 }
@@ -1905,6 +1947,7 @@
 			   int ww, int wh)
 {
 	GtkRequisition mreq;
+	gint16 minx, miny, maxx, maxy;
 	BasePPosClass *klass = 
 		basep_widget_get_pos_class (basep);
 	g_return_if_fail (klass && klass->get_menu_pos);
@@ -1915,19 +1958,30 @@
 			     x, y, wx, wy, 
 			     ww, wh);
 
-	if (*x + mreq.width >
-	    multiscreen_x (basep->screen) + multiscreen_width (basep->screen))
-		*x = multiscreen_x (basep->screen) + 
-			multiscreen_width (basep->screen) - mreq.width;
-	if (*x < multiscreen_x (basep->screen))
-		*x = multiscreen_x (basep->screen);
 
-	if (*y + mreq.height >
-	    multiscreen_y (basep->screen) + multiscreen_height (basep->screen))
-		*y = multiscreen_y (basep->screen) + 
+	if (basep->span_screens) {
+		minx = 0;
+		maxx = gdk_screen_width () - mreq.width;
+		miny = 0;
+		maxy = gdk_screen_height () - mreq.height;
+	}
+	else {
+		minx = multiscreen_x (basep->screen);
+		maxx = multiscreen_x (basep->screen) +
+			multiscreen_width (basep->screen) - mreq.width;
+		miny = multiscreen_y (basep->screen);
+		maxy = multiscreen_y (basep->screen) +
 			multiscreen_height (basep->screen) - mreq.height;
-	if (*y < multiscreen_y (basep->screen))
-		*y = multiscreen_y (basep->screen);
+	}
+	if (*x > maxx)
+		*x = maxx;
+	if (*x < minx)
+		*x = minx;
+
+	if (*y + maxy)
+		*y = maxy;
+	if (*y < miny)
+		*y = miny;
 }
 
 PanelOrientType
@@ -2057,11 +2111,13 @@
 	g_return_if_fail (klass && klass->set_pos);
 
 	/* first take care of switching screens */
-	newscreen = multiscreen_screen_from_pos (x, y);
-	if (newscreen >= 0 &&
-	    newscreen != basep->screen) {
-		force = TRUE;
-		basep_widget_screen_change (basep, newscreen);
+	if (!basep->span_screens) {
+		newscreen = multiscreen_screen_from_pos (x, y);
+		if (newscreen >= 0 &&
+		    newscreen != basep->screen) {
+			force = TRUE;
+			basep_widget_screen_change (basep, newscreen);
+		}
 	}
 
 	basep_widget_get_size (basep, &w, &h);
@@ -2106,6 +2162,20 @@
 	gtk_signal_emit (GTK_OBJECT (basep),
 			 basep_widget_signals[SCREEN_CHANGE_SIGNAL],
 			 screen);
+}
+
+void
+basep_widget_span_screens_change (BasePWidget *basep, gboolean span_screens)
+{
+	g_return_if_fail (basep != NULL);
+	g_return_if_fail (IS_BASEP_WIDGET (basep));
+
+	if (basep->span_screens == span_screens)
+		return;
+
+	gtk_signal_emit (GTK_OBJECT (basep),
+			 basep_widget_signals[SPAN_SCREENS_CHANGE_SIGNAL],
+			 span_screens);
 }
 
 /*****
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/basep-widget.h panel/gnome-core-1.4.0.8/panel/basep-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/basep-widget.h	Sun Apr 28 14:45:55 2002
+++ panel/gnome-core-1.4.0.8/panel/basep-widget.h	Fri May  3 20:11:12 2002
@@ -56,6 +56,8 @@
 
 	int			screen;
 
+	gboolean		span_screens;
+
 	GtkWidget		*ebox;
 	
 	GtkWidget		*panel;
@@ -115,6 +117,9 @@
 	void (* screen_change) (BasePWidget *basep,
 				int screen);
 
+	void (* span_screens_change) (BasePWidget *basep,
+				      gboolean span_screens);
+
 };
 
 /* we mostly want the class for this */
@@ -181,6 +186,7 @@
 						 gboolean packed,
 						 gboolean reverse_arrows,
 						 int screen,
+						 gboolean span_screens,
 						 PanelOrientation orient,
 						 int sz,
 						 BasePMode mode,
@@ -199,6 +205,7 @@
 /* changing parameters */
 void		basep_widget_change_params	(BasePWidget *basep,
 						 int screen,
+						 gboolean span_screens,
 						 PanelOrientation orient,
 						 int sz,
 						 BasePMode mode,
@@ -296,6 +303,8 @@
 						gboolean emit);
 void		basep_widget_screen_change	(BasePWidget *basep,
 						 int screen);
+void		basep_widget_span_screens_change (BasePWidget *basep,
+						  gboolean span_screens);
 
 void            basep_update_frame             (BasePWidget *basep);
 
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/border-widget.c panel/gnome-core-1.4.0.8/panel/border-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/border-widget.c	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/border-widget.c	Fri May  3 20:11:12 2002
@@ -198,6 +198,7 @@
 void
 border_widget_change_params (BorderWidget *border,
 			     int screen,
+			     gboolean span_screens,
 			     BorderEdge edge,
 			     int sz,
 			     BasePMode mode,
@@ -230,6 +231,7 @@
 
 	basep_widget_change_params (BASEP_WIDGET (border),
 				    screen,
+				    span_screens,
 				    new_orient,
 				    sz,
 				    mode,
@@ -295,6 +297,7 @@
 	
 	border_widget_change_params (border,
 				     basep->screen,
+				     basep->span_screens,
 				     edge,
 				     panel->sz,
 				     basep->mode,
@@ -315,6 +318,7 @@
 GtkWidget *
 border_widget_construct (BorderWidget *border,
 			 int screen,
+			 gboolean span_screens,
 			 BorderEdge edge,
 			 gboolean packed,
 			 gboolean reverse_arrows,
@@ -348,6 +352,7 @@
 				packed,
 				reverse_arrows,
 				screen,
+				span_screens,
 				orient,
 				sz,
 				mode,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/border-widget.h panel/gnome-core-1.4.0.8/panel/border-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/border-widget.h	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/border-widget.h	Fri May  3 20:11:12 2002
@@ -54,6 +54,7 @@
 GtkType border_pos_get_type (void) G_GNUC_CONST;
 GtkWidget *border_widget_construct (BorderWidget *border,
 				    int screen,
+				    gboolean span_screens,
 				    BorderEdge edge,
 				    gboolean packed,
 				    gboolean reverse_arrows,
@@ -73,6 +74,7 @@
 
 void border_widget_change_params (BorderWidget *border,
 				  int screen,
+				  gboolean span_screens,
 				  BorderEdge edge,
 				  int sz,
 				  BasePMode mode,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/drawer-widget.c panel/gnome-core-1.4.0.8/panel/drawer-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/drawer-widget.c	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/drawer-widget.c	Fri May  3 20:11:12 2002
@@ -415,6 +415,7 @@
 
 	basep_widget_change_params (BASEP_WIDGET (drawer),
 				    0 /*FIXME */,
+				    BASEP_WIDGET (drawer)->span_screens,
 				    porient,
 				    sz,
 				    mode,
@@ -496,6 +497,7 @@
 	basep_widget_construct (BASEP_WIDGET (drawer),
 				TRUE, TRUE,
 				0 /*FIXME */,
+				TRUE /* FIXME */,
 				porient,
 				sz, mode, state,
 				level,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/edge-widget.c panel/gnome-core-1.4.0.8/panel/edge-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/edge-widget.c	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/edge-widget.c	Fri May  3 20:11:12 2002
@@ -102,10 +102,19 @@
 			return;
 	}
 	
-	innerx = x - multiscreen_x (basep->screen);
-	innery = y - multiscreen_y (basep->screen);
-	screen_width = multiscreen_width (basep->screen);
-	screen_height = multiscreen_height (basep->screen);
+
+	if (basep->span_screens) {
+		innerx = x;
+		innery = y;
+		screen_width = gdk_screen_width ();
+		screen_height = gdk_screen_height ();
+	}
+	else {
+		innerx = x - multiscreen_x (basep->screen);
+		innery = y - multiscreen_y (basep->screen);
+		screen_width = multiscreen_width (basep->screen);
+		screen_height = multiscreen_height (basep->screen);
+	}
 
 	if ( innerx > (screen_width / 3) &&
 	     innerx < (2*screen_width / 3) &&
@@ -144,7 +153,10 @@
 	case BORDER_RIGHT:
 		basep_border_get (basep->screen, BORDER_TOP, NULL, NULL, y);
 		*y += foobar_widget_get_height (basep->screen);
-		*x = multiscreen_width(basep->screen) - w;
+		if (basep->span_screens)
+			*x = gdk_screen_width() - w;
+		else
+			*x = multiscreen_width(basep->screen) - w;
 
 		break;
 	case BORDER_LEFT:
@@ -155,12 +167,17 @@
 		*y = foobar_widget_get_height (basep->screen);
 		break;
 	case BORDER_BOTTOM:
-		*y = multiscreen_height(basep->screen) - h;
+		if (basep->span_screens)
+			*y = gdk_screen_height() - h;
+		else
+			*y = multiscreen_height(basep->screen) - h;
 		break;
 	}
 
-	*x += multiscreen_x (basep->screen);
-	*y += multiscreen_y (basep->screen);
+	if (!basep->span_screens) {
+		*x += multiscreen_x (basep->screen);
+		*y += multiscreen_y (basep->screen);
+	}
 
 	basep_border_queue_recalc (basep->screen);
 }
@@ -176,16 +193,25 @@
 	case BORDER_RIGHT:
 		basep_border_get (basep->screen, BORDER_TOP, NULL, NULL, &a);
 		basep_border_get (basep->screen, BORDER_BOTTOM, NULL, NULL, &b);
-		*h = multiscreen_height (basep->screen) - foobar_widget_get_height (basep->screen) - a - b;
+		if (basep->span_screens)
+			*h = gdk_screen_height () - foobar_widget_get_height (basep->screen) - a - b;
+		else 
+			*h = multiscreen_height (basep->screen) - foobar_widget_get_height (basep->screen) - a - b;
 		break;
 	case BORDER_LEFT:
 		basep_border_get (basep->screen, BORDER_TOP, &a, NULL, NULL);
 		basep_border_get (basep->screen, BORDER_BOTTOM, &b, NULL, NULL);
-		*h = multiscreen_height (basep->screen) - foobar_widget_get_height (basep->screen) - a - b;
+		if (basep->span_screens)
+			*h = gdk_screen_height () - foobar_widget_get_height (basep->screen) - a - b;
+		else
+			*h = multiscreen_height (basep->screen) - foobar_widget_get_height (basep->screen) - a - b;
 		break;
 	case BORDER_TOP:
 	case BORDER_BOTTOM:
-		*w = multiscreen_width (basep->screen);
+		if (basep->span_screens)
+			*w = gdk_screen_width ();
+		else
+			*w = multiscreen_width (basep->screen);
 		break;
 	}
 }
@@ -199,6 +225,7 @@
 
 GtkWidget *
 edge_widget_new (int screen,
+		 gboolean span_screens,
 		 BorderEdge edge,
 		 BasePMode mode,
 		 BasePState state,
@@ -221,6 +248,7 @@
 
 	border_widget_construct (BORDER_WIDGET (basep), 
 				 screen,
+				 span_screens,
 				 edge, 
 				 TRUE, FALSE,
 				 sz, mode, state,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/edge-widget.h panel/gnome-core-1.4.0.8/panel/edge-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/edge-widget.h	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/edge-widget.h	Fri May  3 20:11:12 2002
@@ -46,6 +46,7 @@
 
 GtkType edge_pos_get_type (void) G_GNUC_CONST;
 GtkWidget *edge_widget_new (int screen,
+			    gboolean span_screens,
 			    BorderEdge edge,
 			    BasePMode mode,
 			    BasePState state,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/floating-widget.c panel/gnome-core-1.4.0.8/panel/floating-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/floating-widget.c	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/floating-widget.c	Fri May  3 20:11:12 2002
@@ -412,6 +412,7 @@
 void 
 floating_widget_change_params (FloatingWidget *floating,
 			       int screen,
+			       gboolean span_screens,
 			       gint16 x,
 			       gint16 y,
 			       PanelOrientation orient,
@@ -448,6 +449,7 @@
 
 	basep_widget_change_params (basep,
 				    screen,
+				    span_screens,
 				    orient,
 				    sz,
 				    mode,
@@ -475,6 +477,7 @@
 		PanelWidget *panel = PANEL_WIDGET (basep->panel);
 		floating_widget_change_params (floating, 
 					       basep->screen,
+					       basep->span_screens,
 					       pos->x,
 					       pos->y,
 					       orient,
@@ -504,6 +507,7 @@
 		PanelWidget *panel = PANEL_WIDGET (basep->panel);
 		floating_widget_change_params (floating, 
 					       basep->screen,
+					       basep->span_screens,
 					       x,
 					       y,
 					       panel->orient,
@@ -525,6 +529,7 @@
 
 GtkWidget *
 floating_widget_new (int screen,
+		     gboolean span_screens,
 		     gint16 x,
 		     gint16 y,
 		     PanelOrientation orient,
@@ -555,6 +560,7 @@
 	basep_widget_construct (BASEP_WIDGET (floating),
 				TRUE, FALSE,
 				screen,
+				span_screens,
 				orient,
 				sz,
 				mode,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/floating-widget.h panel/gnome-core-1.4.0.8/panel/floating-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/floating-widget.h	Sun Apr 28 14:45:56 2002
+++ panel/gnome-core-1.4.0.8/panel/floating-widget.h	Fri May  3 20:11:12 2002
@@ -46,6 +46,7 @@
 
 GtkType floating_pos_get_type (void) G_GNUC_CONST;
 GtkWidget *floating_widget_new (int screen,
+				gboolean span_screens,
 				gint16 x,
 				gint16 y,
 				PanelOrientation orient,
@@ -65,6 +66,7 @@
 
 void floating_widget_change_params (FloatingWidget *floating,
 				    int screen,
+				    gboolean span_screens,
 				    gint16 x,
 				    gint16 y,
 				    PanelOrientation orient,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/foobar-widget.h panel/gnome-core-1.4.0.8/panel/foobar-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/foobar-widget.h	Sun Apr 28 14:45:57 2002
+++ panel/gnome-core-1.4.0.8/panel/foobar-widget.h	Fri May  3 20:11:12 2002
@@ -29,6 +29,7 @@
 	/*< private >*/
 
 	int screen;
+	gboolean span_screens;
 
 	GtkWidget *ebox;
 	GtkWidget *hbox;
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/menu.c panel/gnome-core-1.4.0.8/panel/menu.c
--- panel.orig/gnome-core-1.4.0.8/panel/menu.c	Sun Apr 28 14:46:01 2002
+++ panel/gnome-core-1.4.0.8/panel/menu.c	Sat May  4 01:21:00 2002
@@ -31,6 +31,7 @@
 #include "scroll-menu.h"
 #include "icon-entry-hack.h"
 #include "multiscreen-stuff.h"
+
 #include "conditional.h"
 
 /*#define PANEL_DEBUG 1*/
@@ -2398,18 +2399,18 @@
       int screen;
 
       screen = multiscreen_screen_from_pos (x, y);
-      
-      if (screen < 0) {
-	      screen_width = gdk_screen_width ();
-	      screen_height = gdk_screen_height ();
-	      screen_basex = 0;
-	      screen_basey = 0;
-      } else {
-	      screen_width = multiscreen_width (screen);
-	      screen_height = multiscreen_height (screen);
-	      screen_basex = multiscreen_x (screen);
-	      screen_basey = multiscreen_y (screen);
-      }
+
+//      if (basep->span_screens) {
+//             screen_width = gdk_screen_width ();
+//             screen_height = gdk_screen_height ();
+//             screen_basex = 0;
+//             screen_basey = 0;
+//      } else {
+             screen_width = multiscreen_width (screen);
+             screen_height = multiscreen_height (screen);
+             screen_basex = multiscreen_x (screen);
+             screen_basey = multiscreen_y (screen);
+//      }
 
       x -= screen_basex;
       y -= screen_basey;
@@ -2425,7 +2426,7 @@
 	y -= ((y + requisition.height) - screen_height);
       if (y < 0)
 	y = 0;
-
+      
       x += screen_basex;
       y += screen_basey;
     }
@@ -3333,9 +3334,6 @@
 	int w, h;
 	gfloat sw, sw2, sh, sh2;
 
-	sw2 = 2 * (sw = multiscreen_width (screen) / 3);
-	sh2 = 2 * (sh = multiscreen_height (screen) / 3);
-	
 	for (li = panel_list; li != NULL; li = li->next) {
 		pd = li->data;
 
@@ -3348,9 +3346,12 @@
 		if (basep->screen != screen)
 			continue;
 
+		sw2 = 2 * (sw = basep->span_screens ? gdk_screen_width() / 3 : multiscreen_width (screen) / 3);
+		sh2 = 2 * (sh = basep->span_screens ? gdk_screen_height () / 3 : multiscreen_height (screen) / 3);
+	
 		basep_widget_get_pos (basep, &tx, &ty);
-		tx -= multiscreen_x (screen);
-		ty -= multiscreen_y (screen);
+		tx -= basep->span_screens ? 0 : multiscreen_x (screen);
+		ty -= basep->span_screens ? 0 : multiscreen_y (screen);
 		basep_widget_get_size (basep, &w, &h);
 
 		if (PANEL_WIDGET (basep->panel)->orient == PANEL_HORIZONTAL) {
@@ -3386,11 +3387,17 @@
 		}
 	}
 
-	*x = ((float)lowi * multiscreen_width (screen)) / 2.0;
-	*y = ((float)lowj * multiscreen_height (screen)) / 2.0;
-
-	*x += multiscreen_x (screen);
-	*y += multiscreen_y (screen);
+//	if(basep->span_screens) {
+//		*x = ((float)lowi * gdk_screen_width ()) / 2.0;
+//		*y = ((float)lowj * gdk_screen_height ()) / 2.0;
+//	}
+//	else {
+	       *x = ((float)lowi * multiscreen_width (screen)) / 2.0;
+	       *y = ((float)lowj * multiscreen_height (screen)) / 2.0;
+
+	       *x += multiscreen_x (screen);
+	       *y += multiscreen_y (screen);
+//	}
 }
 
 static BorderEdge
@@ -3431,8 +3438,7 @@
 
 	menu_panel = get_panel_from_menu_data (w, TRUE);
 	if (menu_panel != NULL)
-		screen = multiscreen_screen_from_panel
-			(menu_panel->panel_parent);
+		screen = multiscreen_screen_from_panel (menu_panel->panel_parent);
 	else
 		screen = 0;
 
@@ -3440,6 +3446,7 @@
 	case ALIGNED_PANEL: 
 		find_empty_pos (screen, &x, &y);
 		panel = aligned_widget_new (screen,
+					    FALSE,
 					    ALIGNED_LEFT,
 					    BORDER_TOP,
 					    BASEP_EXPLICIT_HIDE,
@@ -3459,6 +3466,7 @@
 		break;
 	case EDGE_PANEL: 
 		panel = edge_widget_new (screen,
+					 FALSE,
 					 find_empty_edge (screen),
 					 BASEP_EXPLICIT_HIDE,
 					 BASEP_SHOWN,
@@ -3477,6 +3485,7 @@
 	case SLIDING_PANEL:
 		find_empty_pos (screen, &x, &y);
 		panel = sliding_widget_new (screen,
+					    FALSE,
 					    SLIDING_ANCHOR_LEFT, 0,
 					    BORDER_TOP,
 					    BASEP_EXPLICIT_HIDE,
@@ -3495,6 +3504,7 @@
 	case FLOATING_PANEL:
 		find_empty_pos (screen, &x, &y);
 		panel = floating_widget_new (screen,
+					     FALSE,
 					     x, y,
 					     PANEL_VERTICAL,
 					     BASEP_EXPLICIT_HIDE,
@@ -4031,6 +4041,7 @@
 	PanelData *pd;
 	int x, y;
 	int w, h;
+	int middlex, middley;
 	BasePWidget *basep;
 	BasePPos *old_pos;
 	PanelWidget *cur_panel = get_panel_from_menu_data(widget, TRUE);
@@ -4057,6 +4068,17 @@
 	old_pos->basep = NULL;
 	pd->type = type;
 
+	if(basep->span_screens) {
+		middlex = gdk_screen_width () / 2;
+		middley = gdk_screen_height () / 2;
+	}
+	else {
+		middlex = multiscreen_x (basep->screen) +
+			multiscreen_width (basep->screen) / 2;
+		middley = multiscreen_y (basep->screen) +
+			multiscreen_height (basep->screen) / 2;
+	}
+
 	/* for now, just ignore non-border types */
 	switch (type) {
 	case EDGE_PANEL: 
@@ -4067,12 +4089,10 @@
 		if (IS_BORDER_POS (old_pos))
 			edge = BORDER_POS (old_pos)->edge;
 		else if (PANEL_WIDGET (cur_panel)->orient == PANEL_HORIZONTAL)
-			edge = (y - multiscreen_y (basep->screen) >
-				(multiscreen_height (basep->screen) / 2))
+			edge = (y > middley)
 				? BORDER_BOTTOM : BORDER_TOP;
 		else
-			edge = (x - multiscreen_x (basep->screen) >
-				(multiscreen_width (basep->screen) / 2))
+			edge = (x > middlex)
 				? BORDER_RIGHT : BORDER_LEFT;
 
 		border_widget_change_edge (BORDER_WIDGET (basep), edge);
@@ -4089,20 +4109,18 @@
 		if (IS_BORDER_POS (old_pos))
 			edge = BORDER_POS (old_pos)->edge;
 		else if (PANEL_WIDGET (cur_panel)->orient == PANEL_HORIZONTAL)
-			edge = (y - multiscreen_y (basep->screen) >
-				(multiscreen_height (basep->screen) / 2))
+			edge = (y > middley)
 				? BORDER_BOTTOM : BORDER_TOP;
 		else
-			edge = (x - multiscreen_x (basep->screen) >
-				(multiscreen_width (basep->screen) / 2))
+			edge = (x > middlex)
 				? BORDER_RIGHT : BORDER_LEFT;
 
 		if (PANEL_WIDGET (cur_panel)->orient == PANEL_HORIZONTAL) {
-			mid = x + w / 2 - multiscreen_x (basep->screen);
-			max = multiscreen_width (basep->screen);
+			mid = basep->span_screens ? x + w / 2 : x + w / 2 - multiscreen_x (basep->screen);
+			max = basep->span_screens ? gdk_screen_width () : multiscreen_width (basep->screen);
 		} else {
-			mid = y + h / 2 - multiscreen_y (basep->screen);
-			max = multiscreen_height (basep->screen);
+			mid = basep->span_screens ? y + h / 2 : y + h / 2 - multiscreen_y (basep->screen);
+			max = basep->span_screens ? gdk_screen_height () : multiscreen_height (basep->screen);
 		}
 	
 		if (mid < max / 3)
@@ -4127,20 +4145,18 @@
 		if (IS_BORDER_POS (old_pos))
 			edge = BORDER_POS (old_pos)->edge;
 		else if (PANEL_WIDGET (cur_panel)->orient == PANEL_HORIZONTAL)
-			edge = (y - multiscreen_y (basep->screen) >
-				(multiscreen_height (basep->screen) / 2))
+			edge = (y > middley)
 				? BORDER_BOTTOM : BORDER_TOP;
 		else
-			edge = (x - multiscreen_x (basep->screen) >
-				(multiscreen_width (basep->screen) / 2))
+			edge = (x > middlex)
 				? BORDER_RIGHT : BORDER_LEFT;
 		
 		if (PANEL_WIDGET (cur_panel)->orient == PANEL_HORIZONTAL) {
-			val = x - multiscreen_x (basep->screen);
-			max = multiscreen_width (basep->screen);
+			val = basep->span_screens ? x : x - multiscreen_x (basep->screen);
+			max = basep->span_screens ? gdk_screen_width () : multiscreen_width (basep->screen);
 		} else {
-			val = y - multiscreen_y (basep->screen);
-			max = multiscreen_height (basep->screen);
+			val = basep->span_screens ? y : y - multiscreen_y (basep->screen);
+			max = basep->span_screens ? gdk_screen_height () : multiscreen_height (basep->screen);
 		}
 		
 		if (val > 0.9 * max) {
@@ -4191,6 +4207,7 @@
 	
 	basep_widget_change_params (basep,
 				    basep->screen,
+				    basep->span_screens,
 				    cur_panel->orient,
 				    cur_panel->sz,
 				    GPOINTER_TO_INT (data),
@@ -4228,6 +4245,7 @@
 	
 	basep_widget_change_params (basep,
 				    basep->screen,
+				    basep->span_screens,
 				    cur_panel->orient,
 				    cur_panel->sz,
 				    basep->mode,
@@ -4265,6 +4283,7 @@
 	
 	basep_widget_change_params (basep,
 				    basep->screen,
+				    basep->span_screens,
 				    cur_panel->orient,
 				    cur_panel->sz,
 				    basep->mode,
@@ -4323,6 +4342,7 @@
 	
 	basep_widget_change_params (basep,
 				    basep->screen,
+				    basep->span_screens,
 				    GPOINTER_TO_INT (data),
 				    cur_panel->sz,
 				    basep->mode,
@@ -4397,6 +4417,7 @@
 
 	basep_widget_change_params (basep,
 				    basep->screen,
+				    basep->span_screens,
 				    cur_panel->orient,
 				    cur_panel->sz,
 				    basep->mode,
@@ -6232,8 +6253,10 @@
 menu_allocated (GtkWidget *menu, GtkAllocation *alloc)
 {
 	int screen = 0;
+	int span_screens = 0;
 	PanelWidget *cur_panel = get_panel_from_menu_data (menu, FALSE);
 	int x, y;
+	int minx, miny, maxx, maxy;
 	GtkWidget *menutop;
 
 	menutop = GTK_MENU_SHELL (menu)->active ?
@@ -6262,31 +6285,43 @@
 			screen = 0;
 	} else if (IS_BASEP_WIDGET (cur_panel->panel_parent)) {
 		screen = BASEP_WIDGET (cur_panel->panel_parent)->screen;
+		span_screens = BASEP_WIDGET (cur_panel->panel_parent)->span_screens;
 	} else if (IS_FOOBAR_WIDGET (cur_panel->panel_parent)) {
 		screen = FOOBAR_WIDGET (cur_panel->panel_parent)->screen;
+		span_screens = FOOBAR_WIDGET (cur_panel->panel_parent)->span_screens;
 	}
 
 	scroll_menu_set_screen_size (SCROLL_MENU (menu),
-				     multiscreen_y (screen),
-				     multiscreen_y (screen) +
-				     	multiscreen_height (screen));
+				     span_screens ? 0 : multiscreen_y (screen),
+				     span_screens ? gdk_screen_height () :
+				     multiscreen_y (screen) + multiscreen_height (screen));
 
 	x = menutop->allocation.x;
 	y = menutop->allocation.y;
 
-	if (x + menutop->allocation.width >
-	    multiscreen_x (screen) + multiscreen_width (screen))
-		x = multiscreen_x (screen) + multiscreen_width (screen) -
+	if(span_screens) {
+		minx = 0;
+		maxx = gdk_screen_width () - menutop->allocation.width;
+		miny = 0;
+		maxy = gdk_screen_height () - menutop->allocation.height;
+	}
+	else {
+		minx = multiscreen_x (screen);
+		maxx = multiscreen_x (screen) + multiscreen_width (screen) -
 			menutop->allocation.width;
-	if (y + menutop->allocation.height >
-	    multiscreen_y (screen) + multiscreen_height (screen))
-		y = multiscreen_y (screen) + multiscreen_height (screen) -
-			menutop->allocation.height;
-
-	if (x < multiscreen_x (screen))
-		x = multiscreen_x (screen);
-	if (y < multiscreen_y (screen))
-		y = multiscreen_y (screen);
+		miny = multiscreen_y (screen);
+		maxy = multiscreen_y (screen) + multiscreen_height (screen) -
+			menutop->allocation.height; 
+	}
+	if (x > maxx)
+		x = maxx;
+	if (y > maxy)
+		y = maxy;
+
+	if (x < minx)
+		x = minx;
+	if (y < miny)
+		y = miny;
 
 	if (x != menutop->allocation.x ||
 	    y != menutop->allocation.y) {
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/multiscreen-stuff.c panel/gnome-core-1.4.0.8/panel/multiscreen-stuff.c
--- panel.orig/gnome-core-1.4.0.8/panel/multiscreen-stuff.c	Sun Apr 28 14:46:01 2002
+++ panel/gnome-core-1.4.0.8/panel/multiscreen-stuff.c	Sat May  4 01:16:18 2002
@@ -82,7 +82,6 @@
 			XineramaQueryScreens (GDK_DISPLAY (),
 					      &screen_num);
 
-
 		if (screen_num <= 0) {
 			/* EEEEEK!, should never happen */
 			goto no_xinerama;
@@ -125,79 +124,74 @@
 	return screens;
 }
 
+
 int
 multiscreen_x (int screen)
 {
 	g_return_val_if_fail (initialized, 0);
-	g_return_val_if_fail (screen >= 0, 0);
 
-	if (screen < screens)
-		return rectangles[screen].x;
-	else
-		return gdk_screen_width () + 10;
+	if ((screen < 0) || (screen >= screens))
+		screen = 0;
+	return rectangles[screen].x;
 }
 
 int
 multiscreen_y (int screen)
 {
 	g_return_val_if_fail (initialized, 0);
-	g_return_val_if_fail (screen >= 0, 0);
 
-	if (screen < screens)
-		return rectangles[screen].y;
-	else
-		return gdk_screen_height () + 10;
+	if ((screen < 0) || (screen >= screens))
+		screen = 0;
+	return rectangles[screen].y;
 }
 
 int
 multiscreen_width (int screen)
 {
 	g_return_val_if_fail (initialized, 0);
-	g_return_val_if_fail (screen >= 0, 0);
 
-	if (screen < screens)
-		return rectangles[screen].width;
-	else
-		return gdk_screen_width ();
+	if ((screen < 0) || (screen >= screens))
+		screen = 0;
+	return rectangles[screen].width;
 }
 
 int
 multiscreen_height (int screen)
 {
 	g_return_val_if_fail (initialized, 0);
-	g_return_val_if_fail (screen >= 0, 0);
 
-	if (screen < screens)
-		return rectangles[screen].height;
-	else
-		return gdk_screen_height ();
+	if ((screen < 0) || (screen >= screens))
+		screen = 0;
+	return rectangles[screen].height;
 }
 
 int
 multiscreen_screen_from_pos (int x, int y)
 {
 	int i;
+	g_return_val_if_fail (initialized, 0);
+
 	for (i = 0; i < screens; i++) {
-		if (x >= rectangles[i].x &&
-		    x <= rectangles[i].x + rectangles[i].width &&
+		    if (x >= rectangles[i].x &&
+		    x < rectangles[i].x + rectangles[i].width &&
 		    y >= rectangles[i].y &&
-		    y <= rectangles[i].y + rectangles[i].height)
+		    y < rectangles[i].y + rectangles[i].height)
 			return i;
 	}
-	return -1;
+	return 0;
 }
 
 int
 multiscreen_screen_from_panel (GtkWidget *widget)
 {
+	int screen = 0;
 	g_return_val_if_fail (widget != NULL, 0);
-	g_return_val_if_fail (IS_BASEP_WIDGET (widget) ||
-			      IS_FOOBAR_WIDGET (widget), 0);
 	
 	if (IS_BASEP_WIDGET (widget))
-		return BASEP_WIDGET (widget)->screen;
+		screen = BASEP_WIDGET (widget)->screen;
 	else if (IS_FOOBAR_WIDGET (widget))
-		return FOOBAR_WIDGET (widget)->screen;
-	else
-		return 0;
+		screen =  FOOBAR_WIDGET (widget)->screen;
+	if ((screen < 0) || (screen >= screens))
+		screen = 0;
+	return screen;
 }
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/panel_config.c panel/gnome-core-1.4.0.8/panel/panel_config.c
--- panel.orig/gnome-core-1.4.0.8/panel/panel_config.c	Sun Apr 28 14:46:02 2002
+++ panel/gnome-core-1.4.0.8/panel/panel_config.c	Fri May  3 23:58:41 2002
@@ -6,7 +6,6 @@
  * Authors: Jacob Berkman
  *          George Lebl
  */
-
 #include <gtk/gtk.h>
 
 #include <config.h>
@@ -138,8 +137,14 @@
 	    ppc->ppc_origin_change)
 		return;
 
-	xlimit = multiscreen_width(panel->screen) - widget->allocation.width;
-	ylimit = multiscreen_height(panel->screen) - widget->allocation.height;
+	if (ppc->span_screens) {
+	    xlimit = gdk_screen_width() - widget->allocation.width;
+	    ylimit = gdk_screen_height() - widget->allocation.height;
+	}
+	else {
+	    xlimit = multiscreen_width(panel->screen) - widget->allocation.width;
+	    ylimit = multiscreen_height(panel->screen) - widget->allocation.height;
+	}
 
 	adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON (ppc->x_spin));
 	if((int)adj->upper == xlimit) {
@@ -204,6 +209,16 @@
 }
 
 void
+update_config_span_screens (BasePWidget *w)
+{
+	PerPanelConfig *ppc = get_config_struct (GTK_WIDGET (w));
+
+	if (ppc == NULL ||
+	    ppc->ppc_origin_change)
+		return;
+}
+
+void
 update_config_screen (BasePWidget *w)
 {
 	PerPanelConfig *ppc = get_config_struct (GTK_WIDGET (w));
@@ -448,11 +463,18 @@
 		return;
 
 	if(ppc->edge == BORDER_LEFT || ppc->edge == BORDER_RIGHT)
-		range = multiscreen_height (panel->screen)
-			- widget->allocation.height;
+		if (ppc->span_screens)
+			range = gdk_screen_height ()
+				- widget->allocation.height;
+		else
+			range = multiscreen_height (panel->screen)
+				- widget->allocation.height;
 	else
-		range = multiscreen_width (panel->screen)
-			- widget->allocation.width;
+		if (ppc->span_screens)
+			range = gdk_screen_width() - widget->allocation.width;
+		else
+			range = multiscreen_width (panel->screen)
+				- widget->allocation.width;
 
 	adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON (ppc->offset_spin));
 	if((int)adj->upper == range)
@@ -507,6 +529,7 @@
 	if(IS_EDGE_WIDGET(ppc->panel))
 		border_widget_change_params(BORDER_WIDGET(ppc->panel),
 					    ppc->screen,
+					    ppc->span_screens,
 					    ppc->edge,
 					    ppc->sz,
 					    ppc->mode,
@@ -524,6 +547,7 @@
 	else if(IS_SLIDING_WIDGET(ppc->panel))
 		sliding_widget_change_params(SLIDING_WIDGET(ppc->panel),
 					     ppc->screen,
+					     ppc->span_screens,
 					     ppc->align,
 					     ppc->offset,
 					     ppc->edge,
@@ -543,6 +567,7 @@
 	else if (IS_ALIGNED_WIDGET (ppc->panel))
 		aligned_widget_change_params (ALIGNED_WIDGET (ppc->panel),
 					      ppc->screen,
+					      ppc->span_screens,
 					      ppc->align,
 					      ppc->edge,
 					      ppc->sz,
@@ -561,6 +586,7 @@
 	else if (IS_FLOATING_WIDGET (ppc->panel))
 		floating_widget_change_params (FLOATING_WIDGET (ppc->panel), 
 					       ppc->screen,
+					       ppc->span_screens,
 					       ppc->x,
 					       ppc->y,
 					       ppc->orient,
@@ -709,12 +735,29 @@
 	panel_config_register_changes (ppc);	
 }
 
+static void
+span_screens_set (GtkWidget *widget, gpointer data)
+{
+	PerPanelConfig *ppc = gtk_object_get_user_data (GTK_OBJECT (widget));
+
+	if (ppc->span_screens_radio == widget)
+		ppc->span_screens = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+
+	if (ppc->span_screens)
+		gtk_widget_set_sensitive(ppc->screen_spin, FALSE);
+	else
+		gtk_widget_set_sensitive(ppc->screen_spin, TRUE);
+
+	panel_config_register_changes (ppc);
+}
+
 static GtkWidget *
 make_misc_widget (PerPanelConfig *ppc, gboolean avoiding)
 {
 	GtkWidget *frame;
-	GtkWidget *box, *hbox;
-	GtkWidget *button, *label;
+	GtkWidget *box, *hbox, *vbox;
+	GtkWidget *button;
+	GtkWidget *span_screens, *limit_screens;
 	GtkObject *range;
 
 	if ( ! avoiding &&
@@ -740,12 +783,25 @@
 			    NULL);
 	gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE,0);
 
+	/* Multiscreen */
 	if (multiscreen_screens () > 1) {
 		hbox = gtk_hbox_new (FALSE, 0);
-		gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
 
-		label = gtk_label_new (_("Current screen:"));
-		gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+		vbox = gtk_vbox_new (FALSE, 0);
+		gtk_box_pack_start (GTK_BOX (box), vbox, FALSE, FALSE, 0);
+
+		ppc->span_screens_radio = span_screens =
+			gtk_radio_button_new_with_label(NULL, _("Panel spans all screens"));
+		gtk_box_pack_start (GTK_BOX (vbox), span_screens, FALSE, FALSE, 0);
+		gtk_object_set_user_data (GTK_OBJECT (span_screens), ppc);
+		gtk_signal_connect (GTK_OBJECT (span_screens), "toggled",
+				    GTK_SIGNAL_FUNC (span_screens_set),
+				    NULL);
+
+		ppc->single_screen_radio = limit_screens =
+			gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (span_screens), _("Panel remains on screen: "));
+		gtk_box_pack_start (GTK_BOX (hbox), limit_screens, FALSE, FALSE, 0);
+		gtk_object_set_user_data (GTK_OBJECT (limit_screens), ppc);
 
 		range = gtk_adjustment_new (ppc->screen,
 					    0, multiscreen_screens () - 1,
@@ -757,9 +813,19 @@
 		gtk_spin_button_set_value (GTK_SPIN_BUTTON (button), ppc->screen);
 		gtk_signal_connect (GTK_OBJECT (button), "changed",
 				    GTK_SIGNAL_FUNC (screen_set), NULL);
-		gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-	}
+		gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
 
+		gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+
+		if (ppc->span_screens) {
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ppc->span_screens_radio), TRUE);
+			gtk_widget_set_sensitive(ppc->screen_spin, FALSE);
+		}
+		else {
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ppc->single_screen_radio), TRUE);
+			gtk_widget_set_sensitive(ppc->screen_spin, TRUE);
+		}
+	}
 	return frame;
 }
 
@@ -1027,10 +1093,16 @@
 	GtkWidget *hbox;
 	int xlimit, ylimit;
 
-	xlimit = multiscreen_width (ppc->screen)
-		- ppc->panel->allocation.width;
-	ylimit = multiscreen_height (ppc->screen)
-		- ppc->panel->allocation.height;
+	if (ppc->span_screens) {
+		xlimit = gdk_screen_width() - ppc->panel->allocation.width;
+		ylimit = gdk_screen_height() - ppc->panel->allocation.height;
+	}
+	else {
+		xlimit = multiscreen_width (ppc->screen)
+			- ppc->panel->allocation.width;
+		ylimit = multiscreen_height (ppc->screen)
+			- ppc->panel->allocation.height;
+	}
 	
 	vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
 	
@@ -1140,7 +1212,7 @@
 	GtkWidget *button;
 	GtkAdjustment *adj;
 	int range;
-	
+
 	vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
 	
 	f = gtk_frame_new (_("Size and Position"));
@@ -1172,11 +1244,20 @@
 	gtk_box_pack_start (GTK_BOX (hbox), l, FALSE, FALSE, 0);
 
 	if(ppc->edge == BORDER_LEFT || ppc->edge == BORDER_RIGHT)
-		range = multiscreen_height (ppc->screen)
-			- ppc->panel->allocation.height;
+		if (ppc->span_screens)
+			range = gdk_screen_height ()
+				- ppc->panel->allocation.height;
+		else
+			range = multiscreen_height (ppc->screen)
+				- ppc->panel->allocation.height;
 	else
-		range = multiscreen_width (ppc->screen)
-			- ppc->panel->allocation.width;
+		if (ppc->span_screens)
+			range = gdk_screen_width ()
+				- ppc->panel->allocation.width;
+		else
+			range = multiscreen_width (ppc->screen)
+				- ppc->panel->allocation.width;
+
 	adj = GTK_ADJUSTMENT(gtk_adjustment_new (ppc->offset, 0, range, 1, 10, 10));
 	ppc->offset_spin = button = 
 		gtk_spin_button_new (adj, 1, 0);
@@ -1555,7 +1636,6 @@
 	GtkWidget *box, *f, *t;
 	GtkWidget *vbox, *noscale, *fit, *strech;
 	GtkWidget *w, *m;
-	GtkWidget *spinbutton;
 
 	vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
 	gtk_container_set_border_width(GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
@@ -1840,6 +1920,7 @@
 
 	ppc->sz = pw->sz;
 	ppc->screen = basep->screen;
+	ppc->span_screens = basep->span_screens;
 	ppc->level = basep->level;
 	ppc->avoid_on_maximize = basep->avoid_on_maximize;
 	ppc->hidebuttons = basep->hidebuttons_enabled;
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/panel_config.h panel/gnome-core-1.4.0.8/panel/panel_config.h
--- panel.orig/gnome-core-1.4.0.8/panel/panel_config.h	Sun Apr 28 14:46:02 2002
+++ panel/gnome-core-1.4.0.8/panel/panel_config.h	Fri May  3 20:11:12 2002
@@ -28,6 +28,8 @@
 	BasePLevel		level;
 	gboolean		avoid_on_maximize;
 
+	gboolean		span_screens;
+
 	/*floating widget*/
 	PanelOrientation        orient;
 	int                     x, y;
@@ -69,10 +71,14 @@
 
 	/*avoid_on_maximize*/
 	GtkWidget               *avoid_on_maximize_button;
+	
 
-	/*avoid_on_maximize*/
+	/*multiscreen*/
+	GtkWidget		*span_screens_radio;
+	GtkWidget		*single_screen_radio;
 	GtkWidget               *screen_spin;
 
+
 	/*hiding stuff*/
 	GtkWidget               *autohide_button;
 	GtkWidget               *hidebuttons_button;
@@ -110,6 +116,7 @@
 void update_config_size (GtkWidget *panel);
 void update_config_level (BasePWidget *panel);
 void update_config_avoid_on_maximize (BasePWidget *panel);
+void update_config_span_screens (BasePWidget *panel);
 void update_config_screen (BasePWidget *panel);
 void update_config_mode (BasePWidget *panel);
 void update_config_hidebuttons (BasePWidget *panel);
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/session.c panel/gnome-core-1.4.0.8/panel/session.c
--- panel.orig/gnome-core-1.4.0.8/panel/session.c	Sun Apr 28 14:46:02 2002
+++ panel/gnome-core-1.4.0.8/panel/session.c	Fri May  3 20:11:12 2002
@@ -582,8 +582,8 @@
 		gnome_config_set_int ("level", basep->level);
 		gnome_config_set_bool ("avoid_on_maximize",
 				       basep->avoid_on_maximize);
-		gnome_config_set_int ("screen",
-				      basep->screen);
+		gnome_config_set_int ("screen", basep->screen);
+		gnome_config_set_bool ("span_screens", basep->span_screens);
 	}
 
 	gnome_config_set_int("unique_id", panel->unique_id);
@@ -631,6 +631,7 @@
 	case FOOBAR_PANEL:
 		gnome_config_set_string ("/panel/Config/clock_format", FOOBAR_WIDGET (pd->panel)->clock_format);
 		gnome_config_set_int ("screen", FOOBAR_WIDGET (pd->panel)->screen);
+		gnome_config_set_bool ("span_screens", FOOBAR_WIDGET (pd->panel)->span_screens);
 		break;
 	default:
 		break;
@@ -1272,6 +1273,7 @@
 		/* Eeeeeeeek! no default config, no user config, this is
 		 * bad bad bad, load a single panel */
 		panel = edge_widget_new (0 /* screen */,
+					 FALSE /* span_screens */,
 					 BORDER_BOTTOM,
 					 BASEP_EXPLICIT_HIDE /* mode */,
 					 BASEP_SHOWN /* state */,
@@ -1319,6 +1321,7 @@
 		int hidebutton_pixmaps_enabled;
 		int unique_id;
 		int screen;
+		gboolean span_screens;
 
 		g_string_sprintf (buf, "%spanel%s/Panel_%d/",
 				  prefix, sep, num);
@@ -1379,6 +1382,9 @@
 		mode = conditional_get_int ("mode", 0, NULL);
 		level = conditional_get_int ("level", 0, NULL);
 		screen = conditional_get_int ("screen", 0, NULL);
+		span_screens = conditional_get_bool ("span_screens", 
+						     FALSE, NULL);
+
 		if (screen < 0)
 			screen = 0;
 #if 0 /* i guess we can't easily do this for now */
@@ -1394,6 +1400,7 @@
 				("avoid_on_maximize", TRUE, NULL);
 
 			panel = edge_widget_new (screen,
+						 span_screens,
 						 edge, 
 						 mode, state,
 						 level, avoid_on_maximize,
@@ -1418,6 +1425,7 @@
 				("avoid_on_maximize", TRUE, NULL);
 
 			panel = aligned_widget_new (screen,
+						    span_screens,
 						    align,
 						    edge,
 						    mode,
@@ -1451,6 +1459,7 @@
 				("avoid_on_maximize", TRUE, NULL);
 
 			panel = sliding_widget_new (screen,
+						    span_screens,
 						    anchor,
 						    offset,
 						    edge,
@@ -1517,6 +1526,7 @@
 				("avoid_on_maximize", FALSE, NULL);
 
 			panel = floating_widget_new (screen,
+						     span_screens,
 						     x,
 						     y,
 						     orient,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/sliding-widget.c panel/gnome-core-1.4.0.8/panel/sliding-widget.c
--- panel.orig/gnome-core-1.4.0.8/panel/sliding-widget.c	Sun Apr 28 14:46:03 2002
+++ panel/gnome-core-1.4.0.8/panel/sliding-widget.c	Fri May  3 20:11:12 2002
@@ -281,6 +281,7 @@
 
 GtkWidget *
 sliding_widget_new (int screen,
+		    gboolean span_screens,
 		    SlidingAnchor anchor,
 		    gint16 offset,
 		    BorderEdge edge,
@@ -308,6 +309,7 @@
 
 	border_widget_construct (BORDER_WIDGET (sliding),
 				 screen,
+				 span_screens,
 				 edge,
 				 TRUE,
 				 FALSE,
@@ -330,6 +332,7 @@
 void 
 sliding_widget_change_params (SlidingWidget *sliding,
 			      int screen,
+			      gboolean span_screens,
 			      SlidingAnchor anchor,
 			      gint16 offset,
 			      BorderEdge edge,
@@ -366,6 +369,7 @@
 
 	border_widget_change_params (BORDER_WIDGET (sliding),
 				     screen,
+				     span_screens,
 				     edge,
 				     sz,
 				     mode,
@@ -394,6 +398,7 @@
 
 	sliding_widget_change_params (sliding,
 				      basep->screen,
+				      basep->span_screens,
 				      pos->anchor,
 				      offset,
 				      BORDER_POS (pos)->edge,
@@ -424,6 +429,7 @@
 
 	sliding_widget_change_params (sliding,
 				      basep->screen,
+				      basep->span_screens,
 				      anchor,
 				      pos->offset,
 				      BORDER_POS (pos)->edge,
@@ -453,6 +459,7 @@
 
 	sliding_widget_change_params (sliding,
 				      basep->screen,
+				      basep->span_screens,
 				      anchor,
 				      offset,
 				      edge,
diff -u --recursive panel.orig/gnome-core-1.4.0.8/panel/sliding-widget.h panel/gnome-core-1.4.0.8/panel/sliding-widget.h
--- panel.orig/gnome-core-1.4.0.8/panel/sliding-widget.h	Sun Apr 28 14:46:03 2002
+++ panel/gnome-core-1.4.0.8/panel/sliding-widget.h	Fri May  3 20:11:12 2002
@@ -56,6 +56,7 @@
 
 GtkType sliding_pos_get_type (void) G_GNUC_CONST;
 GtkWidget *sliding_widget_new (int screen,
+			       gboolean span_screens,
 			       SlidingAnchor anchor,
 			       gint16 offset,
 			       BorderEdge edge,
@@ -75,6 +76,7 @@
 
 void sliding_widget_change_params (SlidingWidget *slidingw,
 				   int screen,
+				   gboolean span_screens,
 				   SlidingAnchor anchor,
 				   gint16 offset,
 				   BorderEdge edge,
