Index: gnome-panel/panel-toplevel.c
===================================================================
--- gnome-panel/panel-toplevel.c	(revision 10177)
+++ gnome-panel/panel-toplevel.c	(working copy)
@@ -1063,6 +1063,7 @@
 				    GtkButton     *button)
 {
 	GtkArrowType arrow_type;
+	gboolean ltr = gtk_widget_get_direction (GTK_WIDGET (toplevel)) == GTK_TEXT_DIR_LTR;
 
 	if (toplevel->priv->animating ||
 	    toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN)
@@ -1081,10 +1082,10 @@
 			direction = GTK_DIR_DOWN;
 			break;
 		case GTK_ARROW_LEFT:
-			direction = GTK_DIR_LEFT;
+			direction = ltr ? GTK_DIR_LEFT : GTK_DIR_RIGHT;
 			break;
 		case GTK_ARROW_RIGHT:
-			direction = GTK_DIR_RIGHT;
+			direction = ltr ? GTK_DIR_RIGHT : GTK_DIR_LEFT;
 			break;
 		default:
 			g_assert_not_reached ();
Index: gnome-panel/panel-widget.c
===================================================================
--- gnome-panel/panel-widget.c	(revision 10177)
+++ gnome-panel/panel-widget.c	(working copy)
@@ -1326,6 +1326,7 @@
 	GList *list;
 	int i;
 	int old_size;
+	gboolean ltr = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR;
 
 	g_return_if_fail(PANEL_IS_WIDGET(widget));
 	g_return_if_fail(allocation!=NULL);
@@ -1395,7 +1396,7 @@
 				}
 
 				ad->cells = challoc.width;
-				challoc.x = ad->constrained;
+				challoc.x = ltr ? ad->constrained : panel->size - ad->constrained - challoc.width;
 				challoc.y = allocation->height / 2 - challoc.height / 2;
 			} else {
 				if (ad->expand_minor)
@@ -1503,7 +1504,7 @@
 				if (ad->expand_minor) {
 					challoc.height = allocation->height;
 				}
-				challoc.x = ad->constrained;
+				challoc.x = ltr ? ad->constrained : panel->size - ad->constrained - challoc.width;
 				challoc.y = allocation->height / 2 - challoc.height / 2;
 			} else {
 				challoc.height = ad->cells;
@@ -1867,17 +1868,18 @@
 	gdk_flush ();
 }
 
-/*get pos of the cursor location*/
+/*get pos of the cursor location in panel coordinates*/
 int
 panel_widget_get_cursorloc (PanelWidget *panel)
 {
 	int x, y;
+	gboolean rtl = gtk_widget_get_direction (GTK_WIDGET (panel)) == GTK_TEXT_DIR_RTL;
 
 	g_return_val_if_fail (PANEL_IS_WIDGET (panel), -1);
 
 	gtk_widget_get_pointer (GTK_WIDGET (panel), &x, &y);
-
-	return panel->orient == GTK_ORIENTATION_HORIZONTAL ? x : y;
+	
+	return panel->orient == GTK_ORIENTATION_HORIZONTAL ? (rtl ? panel->size - x : x) : y;
 }
 
 /*calculates the value to move the applet by*/
Index: gnome-panel/panel-widget.h
===================================================================
--- gnome-panel/panel-widget.h	(revision 10177)
+++ gnome-panel/panel-widget.h	(working copy)
@@ -176,7 +176,7 @@
 /*tells us if an applet is "stuck" on the right side*/
 int		panel_widget_is_applet_stuck	(PanelWidget *panel,
 						 GtkWidget *applet);
-/*get pos of the cursor location*/
+/*get pos of the cursor location in panel coordinaes*/
 int		panel_widget_get_cursorloc	(PanelWidget *panel);
 
 /*needed for other panel types*/
Index: gnome-panel/panel.c
===================================================================
--- gnome-panel/panel.c	(revision 10177)
+++ gnome-panel/panel.c	(working copy)
@@ -350,13 +350,9 @@
 	panel_data   = g_object_get_data (G_OBJECT (toplevel), "PanelData");
 
 	current_event = gtk_get_current_event ();
-	if (current_event->type == GDK_BUTTON_PRESS) {
-		int x = -1, y = 1;
-	
-		gtk_widget_get_pointer (GTK_WIDGET (panel_widget), &x, &y);
-
-		panel_data->insertion_pos = panel_widget->orient == GTK_ORIENTATION_HORIZONTAL ? x : y;
-	} else
+	if (current_event->type == GDK_BUTTON_PRESS)
+		panel_data->insertion_pos = panel_widget_get_cursorloc (panel_widget);
+	else
 		panel_data->insertion_pos = -1;
 	
 	menu = make_popup_panel_menu (panel_widget);
