Index: src/file-manager/fm-icon-view.c
===================================================================
--- src/file-manager/fm-icon-view.c	(revision 13372)
+++ src/file-manager/fm-icon-view.c	(working copy)
@@ -2480,7 +2480,7 @@
 						       click_mode == NAUTILUS_CLICK_POLICY_SINGLE);
 }
 
-static void
+static NautilusIconContainer *
 create_icon_container (FMIconView *icon_view)
 {
 	NautilusIconContainer *icon_container;
@@ -2539,6 +2539,8 @@
 	fm_icon_view_update_click_mode (icon_view);
 
 	gtk_widget_show (GTK_WIDGET (icon_container));
+
+	return icon_container;
 }
 
 /* Handles an URL received from Mozilla */
@@ -2695,6 +2697,7 @@
 fm_icon_view_init (FMIconView *icon_view)
 {
 	static gboolean setup_sound_preview = FALSE;
+	NautilusIconContainer *icon_container;
 
         g_return_if_fail (GTK_BIN (icon_view)->child == NULL);
 
@@ -2702,8 +2705,14 @@
 	icon_view->details->sort = &sort_criteria[0];
 	icon_view->details->filter_by_screen = FALSE;
 
-	create_icon_container (icon_view);
+	icon_container = create_icon_container (icon_view);
 
+	/* Set our default layout mode */
+	nautilus_icon_container_set_layout_mode (icon_container,
+						 gtk_widget_get_direction (GTK_WIDGET(icon_container)) == GTK_TEXT_DIR_RTL ?
+						 NAUTILUS_ICON_LAYOUT_R_L_T_B :
+						 NAUTILUS_ICON_LAYOUT_L_R_T_B);
+
 	if (!setup_sound_preview) {
 		eel_preferences_add_auto_enum (NAUTILUS_PREFERENCES_PREVIEW_SOUND,
 					       &preview_sound_auto_value);
Index: src/file-manager/fm-desktop-icon-view.c
===================================================================
--- src/file-manager/fm-desktop-icon-view.c	(revision 13372)
+++ src/file-manager/fm-desktop-icon-view.c	(working copy)
@@ -568,6 +568,8 @@
 	
 	/* Set our default layout mode */
 	nautilus_icon_container_set_layout_mode (icon_container,
+						 gtk_widget_get_direction (GTK_WIDGET(icon_container)) == GTK_TEXT_DIR_RTL ?
+						 NAUTILUS_ICON_LAYOUT_T_B_R_L :
 						 NAUTILUS_ICON_LAYOUT_T_B_L_R);
 
 	g_signal_connect_object (icon_container, "middle_click",
Index: libnautilus-private/nautilus-icon-dnd.c
===================================================================
--- libnautilus-private/nautilus-icon-dnd.c	(revision 13372)
+++ libnautilus-private/nautilus-icon-dnd.c	(working copy)
@@ -1845,6 +1845,7 @@
 
 		/* reinitialise it for the next dnd */
 		drag_info->drop_occured = FALSE;
+		nautilus_icon_container_flag_icons_rtl();
 	}
 
 }
Index: libnautilus-private/nautilus-icon-private.h
===================================================================
--- libnautilus-private/nautilus-icon-private.h	(revision 13372)
+++ libnautilus-private/nautilus-icon-private.h	(working copy)
@@ -43,6 +43,14 @@
 
 	/* X/Y coordinates. */
 	double x, y;
+
+	/*
+	 * In RTL mode x is RTL x position, we use saved_ltr_x for
+	 * keeping track of x value before it gets converted into
+	 * RTL value, this is used for saving the icon position 
+	 * to the nautilus metafile. 
+	 */
+	 double saved_ltr_x;
 	
 	/* Scale factor (stretches icon). */
 	double scale;
Index: libnautilus-private/nautilus-icon-canvas-item.c
===================================================================
--- libnautilus-private/nautilus-icon-canvas-item.c	(revision 13372)
+++ libnautilus-private/nautilus-icon-canvas-item.c	(working copy)
@@ -188,10 +188,12 @@
 						      ArtIRect                      *rect);
 static void     emblem_layout_reset                  (EmblemLayout                  *layout,
 						      NautilusIconCanvasItem        *icon_item,
-						      ArtIRect                       icon_rect);
+						      ArtIRect                       icon_rect,
+						      gboolean			     is_rtl);
 static gboolean emblem_layout_next                   (EmblemLayout                  *layout,
 						      GdkPixbuf                    **emblem_pixbuf,
-						      ArtIRect                      *emblem_rect);
+						      ArtIRect                      *emblem_rect,
+						      gboolean			     is_rtl);
 static void     draw_pixbuf                          (GdkPixbuf                     *pixbuf,
 						      GdkDrawable                   *drawable,
 						      int                            x,
@@ -471,6 +473,7 @@
 	GdkPixbuf *emblem_pixbuf;
 	EmblemLayout emblem_layout;
 	double item_x, item_y;
+	gboolean is_rtl;
 	
 	g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), NULL);
 
@@ -516,8 +519,11 @@
 	icon_rect.x1 = item_offset_x + gdk_pixbuf_get_width (item->details->pixbuf);
 	icon_rect.y1 = item_offset_y + gdk_pixbuf_get_height (item->details->pixbuf);
 
-	emblem_layout_reset (&emblem_layout, item, icon_rect);
-	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
+
+	is_rtl = nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (canvas));
+
+	emblem_layout_reset (&emblem_layout, item, icon_rect, is_rtl);
+	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect, is_rtl)) {
 		gdk_pixbuf_composite (emblem_pixbuf, pixbuf,
 				      emblem_rect.x0, emblem_rect.y0,
 				      gdk_pixbuf_get_width (emblem_pixbuf),
@@ -726,8 +732,13 @@
 	}
 	
 	if (NAUTILUS_ICON_CONTAINER (EEL_CANVAS_ITEM (item)->canvas)->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE) {
-                text_rectangle.x0 = icon_rectangle.x1;
-                text_rectangle.x1 = text_rectangle.x0 + text_dx + text_width;
+		if (!nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (EEL_CANVAS_ITEM (item)->canvas))) {
+                	text_rectangle.x0 = icon_rectangle.x1;
+                	text_rectangle.x1 = text_rectangle.x0 + text_dx + text_width;
+		} else {
+                	text_rectangle.x1 = icon_rectangle.x0;
+                	text_rectangle.x0 = text_rectangle.x1 - text_dx - text_width;
+		}
                 text_rectangle.y0 = (icon_rectangle.y0 + icon_rectangle.y1) / 2- (int) text_height / 2;
                 text_rectangle.y1 = text_rectangle.y0 + text_height + LABEL_OFFSET / pixels_per_unit;
 	} else {
@@ -763,6 +774,7 @@
 	EmblemLayout emblem_layout;
 	EelCanvasItem *canvas_item;
 	GdkPixbuf *emblem_pixbuf;
+	gboolean is_rtl;
 
 	canvas_item = EEL_CANVAS_ITEM (item);
 	
@@ -776,6 +788,8 @@
 		return;
 	}
 	
+	is_rtl = nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (canvas_item->canvas));
+
 	/* Update canvas and text rect cache */
 	get_icon_canvas_rectangle (item, &item->details->canvas_rect);
 	item->details->text_rect = compute_text_rectangle (item, item->details->canvas_rect, TRUE);
@@ -785,8 +799,8 @@
 	item->details->emblem_rect.x1 = 0;
 	item->details->emblem_rect.y0 = 0;
 	item->details->emblem_rect.y1 = 0;
-	emblem_layout_reset (&emblem_layout, item, item->details->canvas_rect);
-	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
+	emblem_layout_reset (&emblem_layout, item, item->details->canvas_rect, is_rtl);
+	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect, is_rtl)) {
 		art_irect_union (&item->details->emblem_rect, &item->details->emblem_rect, &emblem_rect);
 	}
 
@@ -944,7 +958,7 @@
 	PangoLayout *additional_layout;
 	GdkColor *label_color;
 	int icon_width;
-	gboolean have_editable, have_additional, needs_highlight, needs_frame, prelight_label;
+	gboolean have_editable, have_additional, needs_highlight, needs_frame, prelight_label, is_rtl_label_beside;
 	int max_text_width;
 	int x;
 	GdkGC *gc;
@@ -1053,6 +1067,9 @@
 
 	text_rect = compute_text_rectangle (item, icon_rect, TRUE);
 
+	is_rtl_label_beside = nautilus_icon_container_is_layout_rtl (container) &&
+			      container->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE;
+
 	/* if the icon is highlighted, do some set-up */
 	if (needs_highlight && !details->is_renaming &&
 	    details->text_width > 0 && details->text_height > 0) {
@@ -1060,9 +1077,9 @@
 			    drawable,
 			    GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (container)) ? container->details->highlight_color_rgba : container->details->active_color_rgba,
 			    create_mask,
-			    text_rect.x0,
+			    is_rtl_label_beside ? text_rect.x0 + item->details->text_dx : text_rect.x0,
 			    text_rect.y0,
-			    text_rect.x1 - text_rect.x0,
+			    is_rtl_label_beside ? text_rect.x1 - text_rect.x0 - item->details->text_dx : text_rect.x1 - text_rect.x0,
 			    text_rect.y1 - text_rect.y0);
 	}
 
@@ -1268,11 +1285,11 @@
 }
 
 static void
-emblem_layout_reset (EmblemLayout *layout, NautilusIconCanvasItem *icon_item, ArtIRect icon_rect)
+emblem_layout_reset (EmblemLayout *layout, NautilusIconCanvasItem *icon_item, ArtIRect icon_rect, gboolean is_rtl)
 {
 	layout->icon_item = icon_item;
 	layout->icon_rect = icon_rect;
-	layout->side = RIGHT_SIDE;
+	layout->side = is_rtl ? LEFT_SIDE : RIGHT_SIDE;
 	layout->position = 0;
 	layout->index = 0;
 	layout->emblem = icon_item->details->emblem_pixbufs;
@@ -1281,7 +1298,8 @@
 static gboolean
 emblem_layout_next (EmblemLayout *layout,
 		    GdkPixbuf **emblem_pixbuf,
-		    ArtIRect *emblem_rect)
+		    ArtIRect *emblem_rect,
+		    gboolean is_rtl)
 {
 	GdkPixbuf *pixbuf;
 	int width, height, x, y;
@@ -1397,15 +1415,20 @@
 		/* It doesn't fit, so move to the next side. */
 		switch (layout->side) {
 		case RIGHT_SIDE:
-			layout->side = BOTTOM_SIDE;
+			layout->side = is_rtl ? TOP_SIDE : BOTTOM_SIDE;
 			break;
 		case BOTTOM_SIDE:
+			if (is_rtl)
+			    return FALSE;
 			layout->side = LEFT_SIDE;
 			break;
 		case LEFT_SIDE:
-			layout->side = TOP_SIDE;
+			layout->side = is_rtl ? BOTTOM_SIDE : TOP_SIDE;
 			break;
 		case TOP_SIDE:
+			if (!is_rtl)
+			    return FALSE;
+			layout->side = LEFT_SIDE;
 		default:
 			return FALSE;
 		}
@@ -1740,6 +1763,7 @@
 	EmblemLayout emblem_layout;
 	GdkPixbuf *emblem_pixbuf, *temp_pixbuf;
 	GdkRectangle draw_rect, pixbuf_rect;
+	gboolean is_rtl;
 			
 	icon_item = NAUTILUS_ICON_CANVAS_ITEM (item);
 	details = icon_item->details;
@@ -1775,9 +1799,11 @@
 
 	draw_embedded_text (icon_item, drawable,  icon_rect.x0, icon_rect.y0);
 	
+	is_rtl = nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (item->canvas));
+
 	/* Draw the emblem pixbufs. */
-	emblem_layout_reset (&emblem_layout, icon_item, icon_rect);
-	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
+	emblem_layout_reset (&emblem_layout, icon_item, icon_rect, is_rtl);
+	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect, is_rtl)) {
 		draw_pixbuf (emblem_pixbuf, drawable, emblem_rect.x0, emblem_rect.y0);
 	}
 	
@@ -1840,7 +1866,7 @@
 	pango_layout_set_auto_dir (layout, FALSE);
 	
 	if (container->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE) {
-		if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_LTR) {
+		if (!nautilus_icon_container_is_layout_rtl (container)) {
 			pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT);
 		} else {
 			pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
@@ -2048,6 +2074,7 @@
 	ArtIRect emblem_rect;
 	EmblemLayout emblem_layout;
 	GdkPixbuf *emblem_pixbuf;
+	gboolean is_rtl;
 	
 	details = icon_item->details;
 	
@@ -2074,9 +2101,11 @@
 		return TRUE;
 	}
 
+	is_rtl = nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (EEL_CANVAS_ITEM (icon_item)->canvas));
+
 	/* Check for hit in the emblem pixbufs. */
-	emblem_layout_reset (&emblem_layout, icon_item, icon_item->details->canvas_rect);
-	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
+	emblem_layout_reset (&emblem_layout, icon_item, icon_item->details->canvas_rect, is_rtl);
+	while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect, is_rtl)) {
 		if (hit_test_pixbuf (emblem_pixbuf, emblem_rect, canvas_rect)) {
 			return TRUE;
 		}	
@@ -2131,6 +2160,7 @@
 	double pixels_per_unit;
 	EmblemLayout emblem_layout;
 	GdkPixbuf *emblem_pixbuf;
+	gboolean is_rtl;
 
 	g_assert (x1 != NULL);
 	g_assert (y1 != NULL);
@@ -2161,10 +2191,12 @@
 		/* Compute text rectangle. */
 		text_rect = compute_text_rectangle (icon_item, icon_rect, FALSE);
 		
+		is_rtl = nautilus_icon_container_is_layout_rtl (NAUTILUS_ICON_CONTAINER (item->canvas));
+
 		/* Compute total rectangle, adding in emblem rectangles. */
 		art_irect_union (&total_rect, &icon_rect, &text_rect);
-		emblem_layout_reset (&emblem_layout, icon_item, icon_rect);
-		while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
+		emblem_layout_reset (&emblem_layout, icon_item, icon_rect, is_rtl);
+		while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect, is_rtl)) {
 			emblem_rect.x0 = floor (emblem_rect.x0 / pixels_per_unit);
 			emblem_rect.y0 = floor (emblem_rect.y0 / pixels_per_unit);
 			emblem_rect.x1 = ceil (emblem_rect.x1 / pixels_per_unit);
Index: libnautilus-private/nautilus-icon-container.c
===================================================================
--- libnautilus-private/nautilus-icon-container.c	(revision 13372)
+++ libnautilus-private/nautilus-icon-container.c	(working copy)
@@ -148,6 +148,16 @@
 #define SNAP_CEIL_HORIZONTAL(x) SNAP_HORIZONTAL (ceil, x)
 #define SNAP_CEIL_VERTICAL(y) SNAP_VERTICAL (ceil, y)
 
+#define CANVAS_WIDTH(container) ((GTK_WIDGET (container)->allocation.width \
+				- container->details->left_margin \
+				- container->details->right_margin) \
+				/  EEL_CANVAS (container)->pixels_per_unit)
+
+#define CANVAS_HEIGHT(container) ((GTK_WIDGET (container)->allocation.height \
+			 - container->details->top_margin \
+			 - container->details->bottom_margin) \
+			 / EEL_CANVAS (container)->pixels_per_unit)
+
 /* Copied from NautilusIconContainer */
 #define NAUTILUS_ICON_CONTAINER_SEARCH_DIALOG_TIMEOUT 5000
 
@@ -162,6 +172,8 @@
 	char *action_descriptions[LAST_ACTION];
 } NautilusIconContainerAccessiblePrivate;
 
+static gboolean flag_icons_rtl = FALSE;
+
 static GType         nautilus_icon_container_accessible_get_type (void);
 
 static void          activate_selected_items                        (NautilusIconContainer *container);
@@ -206,6 +218,10 @@
 static void          reveal_icon                                    (NautilusIconContainer *container,
 								     NautilusIcon *icon);
 
+static void	     nautilus_icon_container_set_rtl_positions (NautilusIconContainer *container);
+static double	     get_mirror_x_position                     (NautilusIconContainer *container,
+								NautilusIcon *icon,
+								double x);
 
 static gpointer accessible_parent_class;
 
@@ -293,9 +309,9 @@
 	NautilusIconContainer *container;
 	double pixels_per_unit;	
 	int left, top, right, bottom;
-	int width, height;
-	int x1, y1, x2, y2;
+	int width;
 	int container_x, container_y, container_width, container_height;
+	ArtDRect icon_bounds;
 
 	if (icon->x == x && icon->y == y) {
 		return;
@@ -332,17 +348,24 @@
 		right = left + container_width / pixels_per_unit;
 		bottom = top + container_height / pixels_per_unit;
 
-		icon_get_bounding_box (icon, &x1, &y1, &x2, &y2);
-		width = x2 - x1;
-		height = y2 - y1;
+		icon_bounds = nautilus_icon_canvas_item_get_icon_rectangle (icon->item);
+		width = icon_bounds.x1 - icon_bounds.x0;
 				
-		if (x > right - DESKTOP_ICON_SAFETY_PAD) {
-			x = right - DESKTOP_ICON_SAFETY_PAD;
+		if (nautilus_icon_container_is_layout_rtl(container)) {
+			if (x + width < left + DESKTOP_ICON_SAFETY_PAD) {
+				x = left + DESKTOP_ICON_SAFETY_PAD - width;
+			}
+			if (x + width > right) {
+				x = right - width;
+			}
+		} else {
+			if (x > right - DESKTOP_ICON_SAFETY_PAD) {
+				x = right - DESKTOP_ICON_SAFETY_PAD;
+			}
+			if (x < left) {
+				x = left;
+			}
 		}
-		
-		if (x < left) {
-			x = left;
-		}
 		if (y > bottom - DESKTOP_ICON_SAFETY_PAD) {
 			y = bottom - DESKTOP_ICON_SAFETY_PAD;
 		}
@@ -886,6 +909,14 @@
 	 */
 	eel_gtk_adjustment_clamp_value (hadj);
 	eel_gtk_adjustment_clamp_value (vadj);
+
+	/*
+	 * In RTL mode, when displayed force horizontal scrollbar to the 
+	 * right side.
+	 */
+
+	if (nautilus_icon_container_is_layout_rtl(container))
+		gtk_adjustment_set_value (hadj, hadj->upper - hadj->page_size);
 }
 
 static int
@@ -950,8 +981,9 @@
 	double x, y_offset;
 	IconPositions *position;
 	int i;
+	gboolean is_rtl;
 
-	/* FIXME: Should layout differently when in RTL base mode */
+	is_rtl = nautilus_icon_container_is_layout_rtl (container);
 
 	/* Lay out the icons along the baseline. */
 	x = ICON_PAD_LEFT;
@@ -969,9 +1001,11 @@
 
 		icon_set_position
 			(icon,
-			 x + position->x_offset,
+			 is_rtl ? get_mirror_x_position (container, icon, x + position->x_offset) : x + position->x_offset,
 			 y + y_offset);
 
+		icon->saved_ltr_x = is_rtl ? get_mirror_x_position (container, icon, icon->x) : icon->x;
+
 		x += position->width;
 	}
 }
@@ -1008,14 +1042,8 @@
 	positions = g_array_new (FALSE, FALSE, sizeof (IconPositions));
 	
 	/* Lay out icons a line at a time. */
-	canvas_width = (GTK_WIDGET (container)->allocation.width
-			- container->details->left_margin
-			- container->details->right_margin)
-		/ EEL_CANVAS (container)->pixels_per_unit;
-	canvas_height = (GTK_WIDGET (container)->allocation.height
-			 - container->details->top_margin
-			 - container->details->bottom_margin)
-		/ EEL_CANVAS (container)->pixels_per_unit;
+	canvas_width = CANVAS_WIDTH(container);
+	canvas_height = CANVAS_HEIGHT(container);
 
 	max_icon_width = max_text_width = 0.0;
 
@@ -1158,6 +1186,9 @@
 	icon_width = icon_position.x1 - icon_position.x0;
 	icon_height = icon_position.y1 - icon_position.y0;
 
+	if (nautilus_icon_container_is_layout_rtl (container))
+	    *x = get_mirror_x_position (container, icon, *x);
+
 	if (*x + icon_width / 2 < DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X) {
 		*x = DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X - icon_width / 2;
 	}
@@ -1168,7 +1199,11 @@
 
 	center_x = *x + icon_width / 2;
 	*x = SNAP_NEAREST_HORIZONTAL (center_x) - (icon_width / 2);
+	if (nautilus_icon_container_is_layout_rtl (container)) {
+	    *x = get_mirror_x_position (container, icon, *x);
+	}
 
+
 	/* Find the grid position vertically and place on the proper baseline */
 	baseline_y = *y + icon_height;
 	baseline_y = SNAP_NEAREST_VERTICAL (baseline_y);
@@ -1206,14 +1241,8 @@
 	int i;
 
 	/* Get container dimensions */
-	width  = (GTK_WIDGET (container)->allocation.width
-		  - container->details->left_margin
-		  - container->details->right_margin) /
-		EEL_CANVAS (container)->pixels_per_unit;
-	height = (GTK_WIDGET (container)->allocation.height
-		  - container->details->top_margin
-		  - container->details->bottom_margin) /
-		EEL_CANVAS (container)->pixels_per_unit;
+	width  = CANVAS_WIDTH(container);
+	height = CANVAS_HEIGHT(container);
 
 	num_columns = width / SNAP_SIZE_X;
 	num_rows = height / SNAP_SIZE_Y;
@@ -1342,14 +1371,8 @@
 	gboolean collision;
 
 	/* Get container dimensions */
-	canvas_width  = (GTK_WIDGET (container)->allocation.width
-			 - container->details->left_margin
-			 - container->details->right_margin) /
-		EEL_CANVAS (container)->pixels_per_unit;
-	canvas_height = (GTK_WIDGET (container)->allocation.height
-			 - container->details->top_margin
-			 - container->details->bottom_margin) /
-		EEL_CANVAS (container)->pixels_per_unit;
+	canvas_width  = CANVAS_WIDTH(container);
+	canvas_height = CANVAS_HEIGHT(container);
 
 	icon_get_bounding_box (icon, 
 			       &icon_position.x0, &icon_position.y0, 
@@ -1412,6 +1435,10 @@
 	unplaced_icons = g_list_sort (unplaced_icons, 
 				      compare_icons_by_position);
 
+	if (nautilus_icon_container_is_layout_rtl (container)) {
+		unplaced_icons = g_list_reverse (unplaced_icons);
+	}
+
 	grid = placement_grid_new (container, TRUE);
 
 	if (!grid) {
@@ -1423,25 +1450,60 @@
 		int x, y;
 
 		icon = l->data;
-		x = icon->x;
+		x = icon->saved_ltr_x;
 		y = icon->y;
-
 		find_empty_location (container, grid, 
 				     icon, x, y, &x, &y);
 
 		icon_set_position (icon, x, y);
-
+		icon->saved_ltr_x = icon->x;
 		placement_grid_mark_icon (grid, icon);
 	}
 
 	g_list_free (unplaced_icons);
 
 	placement_grid_free (grid);
+
+	if (nautilus_icon_container_is_layout_rtl (container)) {
+		nautilus_icon_container_set_rtl_positions (container);
+	}
 }
 
+static double
+get_mirror_x_position (NautilusIconContainer *container, NautilusIcon *icon, double x) {
+	ArtDRect icon_bounds;
+
+	icon_bounds = nautilus_icon_canvas_item_get_icon_rectangle (icon->item);
+
+	return CANVAS_WIDTH(container) - x - (icon_bounds.x1 - icon_bounds.x0);
+}
+
+void 
+nautilus_icon_container_flag_icons_rtl (void) {
+	flag_icons_rtl = TRUE;
+}
+
 static void
-lay_down_icons_tblr (NautilusIconContainer *container, GList *icons)
+nautilus_icon_container_set_rtl_positions (NautilusIconContainer *container)
 {
+	GList *l;
+	NautilusIcon *icon;
+	double x;
+
+	if (!container->details->icons) {
+		return;
+	}
+
+	for (l = container->details->icons; l != NULL; l = l->next) {
+		icon = l->data;
+		x = get_mirror_x_position (container, icon, icon->saved_ltr_x);
+		icon_set_position (icon, x, icon->y);
+	}
+}
+
+static void
+lay_down_icons_vertical (NautilusIconContainer *container, GList *icons)
+{
 	GList *p, *placed_icons, *unplaced_icons;
 	int total, new_length, placed;
 	NautilusIcon *icon;
@@ -1450,14 +1512,8 @@
 	ArtDRect icon_rect;
 
 	/* Get container dimensions */
-	width  = GTK_WIDGET (container)->allocation.width /
-		EEL_CANVAS (container)->pixels_per_unit
-		- container->details->left_margin
-		- container->details->right_margin;
-	height = GTK_WIDGET (container)->allocation.height /
-		EEL_CANVAS (container)->pixels_per_unit
-		- container->details->top_margin
-		- container->details->bottom_margin;
+	width  = CANVAS_WIDTH(container);
+	height = CANVAS_HEIGHT(container);
 
 	/* Determine which icons have and have not been placed */
 	placed_icons = NULL;
@@ -1472,6 +1528,7 @@
 		for (p = container->details->icons; p != NULL; p = p->next) {
 			icon = p->data;
 			if (icon_is_positioned (icon)) {
+				icon_set_position(icon, icon->saved_ltr_x, icon->y);
 				placed_icons = g_list_prepend (placed_icons, icon);
 			} else {
 				icon->x = 0;
@@ -1507,6 +1564,7 @@
 						     &x, &y);
 				
 				icon_set_position (icon, x, y);
+				icon->saved_ltr_x = x;
 				placement_grid_mark_icon (grid, icon);
 			}
 
@@ -1595,6 +1653,7 @@
 						   center_x - (icon_rect.x1 - icon_rect.x0) / 2,
 						   y);
 				
+				icon->saved_ltr_x = icon->x;
 				y += icon_height + DESKTOP_PAD_VERTICAL;
 			}
 			icons = p;
@@ -1618,14 +1677,13 @@
 	switch (container->details->layout_mode)
 	{
 	case NAUTILUS_ICON_LAYOUT_L_R_T_B:
+	case NAUTILUS_ICON_LAYOUT_R_L_T_B:
 		lay_down_icons_horizontal (container, icons, start_y);
 		break;
 		
 	case NAUTILUS_ICON_LAYOUT_T_B_L_R:
 	case NAUTILUS_ICON_LAYOUT_T_B_R_L:
-		/* FIXME bugzilla.gnome.org 42479: 
-		 * Need to handle T_B_R_L differently. */
-		lay_down_icons_tblr (container, icons);
+		lay_down_icons_vertical (container, icons);
 		break;
 		
 	default:
@@ -1649,6 +1707,10 @@
 		lay_down_icons (container, container->details->icons, 0);
 	}
 
+	if (nautilus_icon_container_is_layout_rtl (container)) {
+		nautilus_icon_container_set_rtl_positions (container);
+	}
+
 	nautilus_icon_container_update_scroll_region (container);
 
 	process_pending_icon_to_reveal (container);
@@ -1887,10 +1949,12 @@
 			icon_set_position (icon, x, y);
 			emit_signal = update_position;
 		}
+
+		icon->saved_ltr_x = nautilus_icon_container_is_layout_rtl (container) ? get_mirror_x_position (container, icon, icon->x) : icon->x;
 	}
 	
 	if (emit_signal) {
-		position.x = icon->x;
+		position.x = icon->saved_ltr_x;
 		position.y = icon->y;
 		position.scale = scale;
 		g_signal_emit (container,
@@ -2346,10 +2410,10 @@
 		return +1;
 	}
 	if (ax < bx) {
-		return +1;
+		return (nautilus_icon_container_is_layout_rtl (container) ? -1 : +1);
 	}
 	if (ax > bx) {
-		return -1;
+		return (nautilus_icon_container_is_layout_rtl (container) ? +1 : -1);
 	}
 	return compare_icons_by_uri (container, icon_a, icon_b);
 }
@@ -3541,8 +3605,13 @@
 	ungrab_stretch_icon (container);
 
 	/* now that we're done stretching, update the icon's position */
+	
 	icon = container->details->drag_icon;	
-	position.x = icon->x;
+	if (nautilus_icon_container_is_layout_rtl (container)) {
+		position.x = icon->saved_ltr_x = get_mirror_x_position (container, icon, icon->x);
+	} else {
+		position.x = icon->x;
+	}
 	position.y = icon->y;
 	position.scale = icon->scale;
 	g_signal_emit (container,
@@ -5925,7 +5994,21 @@
 	icon->scale = position.scale;
 	if (!container->details->auto_layout) {
 		if (have_stored_position) {
-			icon_set_position (icon, position.x, position.y);
+			/* 
+			 * Applies for non-local icons dropped
+			 * to nautilus and new folders created
+			 */
+			if (nautilus_icon_container_is_layout_rtl (container) && flag_icons_rtl) {
+				nautilus_icon_container_move_icon (container,
+							   icon,
+							   position.x, position.y,
+							   icon->scale,
+							   FALSE, TRUE, TRUE);
+			} else {
+				icon_set_position (icon, position.x, position.y);
+				icon->saved_ltr_x = icon->x;
+			}
+
 		} else {
 			return FALSE;
 		}
@@ -5971,6 +6054,16 @@
 
 		finish_adding_icon (container, icon);
 	}
+
+	/* 
+	 * DnD'ed multiple icons or new folders added, 
+	 * if any, are already positioned
+	 * in assign_icon_position routine
+	 */
+
+	if (new_icons)
+		flag_icons_rtl = FALSE;	
+		
 	g_list_free (new_icons);
 
 	if (semi_position_icons != NULL) {
@@ -6880,7 +6973,7 @@
 	for (p = container->details->icons; p != NULL; p = p->next) {
 		icon = p->data;
 
-		position.x = icon->x;
+		position.x = icon->saved_ltr_x;
 		position.y = icon->y;
 		position.scale = icon->scale;
 		g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0,
@@ -7008,6 +7101,7 @@
 	NautilusIconContainerDetails *details;
 	NautilusIcon *icon;
 	ArtDRect icon_rect;
+	ArtDRect text_rect;
 	PangoContext *context;
 	PangoFontDescription *desc;
 	const char *editable_text;
@@ -7079,14 +7173,15 @@
 	pango_font_description_free (desc);
 	
 	icon_rect = nautilus_icon_canvas_item_get_icon_rectangle (icon->item);
+	text_rect = nautilus_icon_canvas_item_get_text_rectangle (icon->item);
 	
 	width = nautilus_icon_canvas_item_get_max_text_width (icon->item);
 
 
 	if (details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE) {
 		eel_canvas_w2c (EEL_CANVAS_ITEM (icon->item)->canvas,
-				icon_rect.x1,
-				icon_rect.y0,
+				text_rect.x0,
+				text_rect.y0,
 				&x, &y);
 	} else {
 		eel_canvas_w2c (EEL_CANVAS_ITEM (icon->item)->canvas,
@@ -8216,4 +8311,13 @@
 	EEL_CHECK_STRING_RESULT (check_compute_stretch (100, 100, 64, 105, 105, 40, 40), "35,35:129");
 }
 
+gboolean
+nautilus_icon_container_is_layout_rtl (NautilusIconContainer *container)
+{
+	g_return_val_if_fail (NAUTILUS_IS_ICON_CONTAINER (container), 0);
+
+	return container->details->layout_mode == NAUTILUS_ICON_LAYOUT_T_B_R_L ||
+		container->details->layout_mode == NAUTILUS_ICON_LAYOUT_R_L_T_B;
+}
+
 #endif /* ! NAUTILUS_OMIT_SELF_CHECK */
Index: libnautilus-private/nautilus-icon-container.h
===================================================================
--- libnautilus-private/nautilus-icon-container.h	(revision 13372)
+++ libnautilus-private/nautilus-icon-container.h	(working copy)
@@ -56,6 +56,7 @@
 
 typedef enum {
 	NAUTILUS_ICON_LAYOUT_L_R_T_B,
+	NAUTILUS_ICON_LAYOUT_R_L_T_B,
 	NAUTILUS_ICON_LAYOUT_T_B_L_R,
 	NAUTILUS_ICON_LAYOUT_T_B_R_L
 } NautilusIconLayoutMode;
@@ -299,4 +300,6 @@
 void              nautilus_icon_container_set_allow_moves               (NautilusIconContainer  *container,
 									 gboolean                allow_moves);
 
+void              nautilus_icon_container_flag_icons_rtl               	(void);
+gboolean	  nautilus_icon_container_is_layout_rtl			(NautilusIconContainer  *container);
 #endif /* NAUTILUS_ICON_CONTAINER_H */
Index: libnautilus-private/nautilus-file-operations.c
===================================================================
--- libnautilus-private/nautilus-file-operations.c	(revision 13372)
+++ libnautilus-private/nautilus-file-operations.c	(working copy)
@@ -33,6 +33,7 @@
 #include "nautilus-debug-log.h"
 #include "nautilus-file-operations-progress.h"
 #include "nautilus-lib-self-check-functions.h"
+#include "nautilus-icon-container.h"
 
 #include <eel/eel-glib-extensions.h>
 #include <eel/eel-pango-extensions.h>
@@ -1723,6 +1724,7 @@
 	GdkPoint point;
 
 	if (icon_position_iterator_get_next (position_iterator, source_name, target_name, &point)) {
+		nautilus_icon_container_flag_icons_rtl ();
 		nautilus_file_changes_queue_schedule_position_set (target_name, point, position_iterator->screen);
 	} else {
 		nautilus_file_changes_queue_schedule_position_remove (target_name);
