diff --git a/eel/eel-gdk-pixbuf-extensions.c b/eel/eel-gdk-pixbuf-extensions.c
index 0a4a146..95fdd4c 100644
--- a/eel/eel-gdk-pixbuf-extensions.c
+++ b/eel/eel-gdk-pixbuf-extensions.c
@@ -31,6 +31,7 @@
 #include "eel-debug.h"
 #include "eel-gdk-extensions.h"
 #include "eel-glib-extensions.h"
+#include "eel-graphic-effects.h"
 #include "eel-lib-self-check-functions.h"
 #include "eel-string.h"
 #include <gdk-pixbuf/gdk-pixbuf.h>
@@ -1154,6 +1155,117 @@ eel_gdk_pixbuf_scale_down (GdkPixbuf *pixbuf,
 	return dest_pixbuf;
 }
 
+static guchar
+eel_gdk_pixbuf_lighten_pixbuf_component (guchar cur_value,
+                                         guint lighten_value)
+{
+	int new_value = cur_value;
+	if (lighten_value > 0) {
+		new_value += lighten_value + (new_value >> 3);
+		if (new_value > 255) {
+			new_value = 255;
+		}
+	}
+	return (guchar) new_value;
+}
+
+static GdkPixbuf *
+eel_gdk_pixbuf_lighten (GdkPixbuf* src,
+                        guint lighten_value)
+{
+	GdkPixbuf *dest;
+	int i, j;
+	int width, height, has_alpha, src_row_stride, dst_row_stride;
+	guchar *target_pixels, *original_pixels;
+	guchar *pixsrc, *pixdest;
+
+	g_assert (gdk_pixbuf_get_colorspace (src) == GDK_COLORSPACE_RGB);
+	g_assert ((!gdk_pixbuf_get_has_alpha (src)
+			       && gdk_pixbuf_get_n_channels (src) == 3)
+			      || (gdk_pixbuf_get_has_alpha (src)
+				  && gdk_pixbuf_get_n_channels (src) == 4));
+	g_assert (gdk_pixbuf_get_bits_per_sample (src) == 8);
+
+	dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
+			       gdk_pixbuf_get_has_alpha (src),
+			       gdk_pixbuf_get_bits_per_sample (src),
+			       gdk_pixbuf_get_width (src),
+			       gdk_pixbuf_get_height (src));
+	
+	has_alpha = gdk_pixbuf_get_has_alpha (src);
+	width = gdk_pixbuf_get_width (src);
+	height = gdk_pixbuf_get_height (src);
+	dst_row_stride = gdk_pixbuf_get_rowstride (dest);
+	src_row_stride = gdk_pixbuf_get_rowstride (src);
+	target_pixels = gdk_pixbuf_get_pixels (dest);
+	original_pixels = gdk_pixbuf_get_pixels (src);
+
+	for (i = 0; i < height; i++) {
+		pixdest = target_pixels + i * dst_row_stride;
+		pixsrc = original_pixels + i * src_row_stride;
+		for (j = 0; j < width; j++) {		
+			*pixdest++ = eel_gdk_pixbuf_lighten_pixbuf_component (*pixsrc++, lighten_value);
+			*pixdest++ = eel_gdk_pixbuf_lighten_pixbuf_component (*pixsrc++, lighten_value);
+			*pixdest++ = eel_gdk_pixbuf_lighten_pixbuf_component (*pixsrc++, lighten_value);
+			if (has_alpha) {
+				*pixdest++ = *pixsrc++;
+			}
+		}
+	}
+	return dest;
+}
+
+GdkPixbuf *
+eel_gdk_pixbuf_render (GdkPixbuf *pixbuf,
+                       guint render_mode,
+                       guint saturation,
+                       guint brightness,
+                       guint lighten_value,
+                       guint color)
+{
+ 	GdkPixbuf *temp_pixbuf, *old_pixbuf;
+
+	if (render_mode == 1) {
+	/* lighten icon */
+		temp_pixbuf = eel_create_spotlight_pixbuf (pixbuf);
+	}
+	else if (render_mode == 2) {
+	/* colorize icon */
+		temp_pixbuf = eel_create_colorized_pixbuf (pixbuf,
+				   EEL_RGBA_COLOR_GET_R (color),
+				   EEL_RGBA_COLOR_GET_G (color),
+				   EEL_RGBA_COLOR_GET_B (color));
+	} else if (render_mode == 3) {
+	/* monochromely colorize icon */
+		old_pixbuf = eel_create_darkened_pixbuf (pixbuf, 0, 255);		
+		temp_pixbuf = eel_create_colorized_pixbuf (old_pixbuf,
+				   EEL_RGBA_COLOR_GET_R (color),
+				   EEL_RGBA_COLOR_GET_G (color),
+				   EEL_RGBA_COLOR_GET_B (color));
+		g_object_unref (old_pixbuf);
+	} else {
+		temp_pixbuf = NULL;
+	}
+
+	if (saturation < 255 || brightness < 255 || temp_pixbuf == NULL) { // temp_pixbuf == NULL just for safer code (return copy)
+		old_pixbuf = temp_pixbuf;
+		temp_pixbuf = eel_create_darkened_pixbuf (temp_pixbuf ? temp_pixbuf : pixbuf, saturation, brightness);
+		if (old_pixbuf) {
+			g_object_unref (old_pixbuf);
+		}
+	}
+
+	if (lighten_value > 0) {
+		old_pixbuf = temp_pixbuf;
+  		temp_pixbuf = eel_gdk_pixbuf_lighten (temp_pixbuf ? temp_pixbuf : pixbuf, lighten_value);
+		if (old_pixbuf) {
+			g_object_unref (old_pixbuf);
+		}
+	}
+
+	return temp_pixbuf;
+}
+
 
 #if !defined (EEL_OMIT_SELF_CHECK)
 
diff --git a/eel/eel-gdk-pixbuf-extensions.h b/eel/eel-gdk-pixbuf-extensions.h
index f6801e7..d9919f6 100644
--- a/eel/eel-gdk-pixbuf-extensions.h
+++ b/eel/eel-gdk-pixbuf-extensions.h
@@ -152,4 +152,11 @@ GdkPixbuf *          eel_gdk_pixbuf_scale_down                (GdkPixbuf *pixbuf
 							       int dest_width,
 							       int dest_height);
 
+GdkPixbuf *          eel_gdk_pixbuf_render                    (GdkPixbuf *pixbuf,
+                                                               guint render_mode,
+                                                               guint saturation,
+                                                               guint brightness,
+                                                               guint lighten_value,
+                                                               guint color);
+
 #endif /* EEL_GDK_PIXBUF_EXTENSIONS_H */
diff --git a/libnautilus-private/nautilus-clipboard-monitor.c b/libnautilus-private/nautilus-clipboard-monitor.c
index 9e5de9b..e800d6d 100644
--- a/libnautilus-private/nautilus-clipboard-monitor.c
+++ b/libnautilus-private/nautilus-clipboard-monitor.c
@@ -24,11 +24,11 @@
 
 #include <config.h>
 #include "nautilus-clipboard-monitor.h"
+#include "nautilus-file.h"
 
 #include <eel/eel-debug.h>
 #include <eel/eel-gtk-macros.h>
 #include <eel/eel-glib-extensions.h>
-#include <eel/eel-glib-extensions.h>
 #include <gtk/gtk.h>
 
 /* X11 has a weakness when it comes to clipboard handling,
@@ -48,18 +48,18 @@
 
 enum {
 	CLIPBOARD_CHANGED,
+	CLIPBOARD_INFO,
 	LAST_SIGNAL
 };
 
-static guint signals[LAST_SIGNAL];
+struct NautilusClipboardMonitorDetails {
+	NautilusClipboardInfo *info;
+};
 
-static void nautilus_clipboard_monitor_init       (gpointer              object,
-						   gpointer              klass);
-static void nautilus_clipboard_monitor_class_init (gpointer              klass);
+static guint signals[LAST_SIGNAL];
+static GdkAtom copied_files_atom;
 
-EEL_CLASS_BOILERPLATE (NautilusClipboardMonitor,
-		       nautilus_clipboard_monitor,
-		       G_TYPE_OBJECT)
+G_DEFINE_TYPE (NautilusClipboardMonitor, nautilus_clipboard_monitor, G_TYPE_OBJECT);
 
 static NautilusClipboardMonitor *clipboard_monitor = NULL;
 
@@ -97,12 +97,48 @@ nautilus_clipboard_monitor_emit_changed (void)
 	g_signal_emit (monitor, signals[CLIPBOARD_CHANGED], 0);
 }
 
+static NautilusClipboardInfo *
+nautilus_clipboard_info_new (GList *files,
+                             gboolean cut)
+{
+	NautilusClipboardInfo *info;
+
+	info = g_slice_new0 (NautilusClipboardInfo);
+	info->files = nautilus_file_list_copy (files);
+	info->cut = cut;
+
+	return info;
+}
+
+static NautilusClipboardInfo *
+nautilus_clipboard_info_copy (NautilusClipboardInfo *info)
+{
+	NautilusClipboardInfo *new_info;
+
+	new_info = NULL;
+
+	if (info != NULL) {
+		new_info = nautilus_clipboard_info_new (info->files,
+			                                info->cut);
+	}
+
+	return new_info;
+}
+
 static void
-nautilus_clipboard_monitor_init (gpointer object, gpointer klass)
+nautilus_clipboard_info_free (NautilusClipboardInfo *info)
 {
-	NautilusClipboardMonitor *monitor;
+	nautilus_file_list_free (info->files);
 
-	monitor = NAUTILUS_CLIPBOARD_MONITOR (object);
+	g_slice_free (NautilusClipboardInfo, info);
+}
+
+static void
+nautilus_clipboard_monitor_init (NautilusClipboardMonitor *monitor)
+{
+	monitor->details = 
+		G_TYPE_INSTANCE_GET_PRIVATE (monitor, NAUTILUS_TYPE_CLIPBOARD_MONITOR,
+		                             NautilusClipboardMonitorDetails);
 }	
 
 static void
@@ -112,18 +148,24 @@ clipboard_monitor_finalize (GObject *object)
 
 	monitor = NAUTILUS_CLIPBOARD_MONITOR (object);
 
-	EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+	if (monitor->details->info != NULL) {
+		nautilus_clipboard_info_free (monitor->details->info);
+		monitor->details->info = NULL;
+	}
+
+	G_OBJECT_CLASS (nautilus_clipboard_monitor_parent_class)->finalize (object);
 }
 
 static void
-nautilus_clipboard_monitor_class_init (gpointer klass)
+nautilus_clipboard_monitor_class_init (NautilusClipboardMonitorClass *klass)
 {
 	GObjectClass *object_class;
 
 	object_class = G_OBJECT_CLASS (klass);
-	
 	object_class->finalize = clipboard_monitor_finalize;
 
+	copied_files_atom = gdk_atom_intern ("x-special/gnome-copied-files", FALSE);
+
 	signals[CLIPBOARD_CHANGED] =
 		g_signal_new ("clipboard_changed",
 		              G_TYPE_FROM_CLASS (klass),
@@ -132,6 +174,138 @@ nautilus_clipboard_monitor_class_init (gpointer klass)
 		              NULL, NULL,
 		              g_cclosure_marshal_VOID__VOID,
 		              G_TYPE_NONE, 0);
+	signals[CLIPBOARD_INFO] =
+		g_signal_new ("clipboard_info",
+		              G_TYPE_FROM_CLASS (klass),
+		              G_SIGNAL_RUN_LAST,
+		              G_STRUCT_OFFSET (NautilusClipboardMonitorClass, clipboard_info),
+		              NULL, NULL,
+		              g_cclosure_marshal_VOID__POINTER,
+		              G_TYPE_NONE,
+		              1, G_TYPE_POINTER);
+
+	g_type_class_add_private (klass, sizeof (NautilusClipboardMonitorDetails));
+}
+
+void
+nautilus_clipboard_monitor_set_clipboard_info (NautilusClipboardMonitor *monitor,
+                                               NautilusClipboardInfo *info)
+{
+	if (monitor->details->info != NULL) {
+		nautilus_clipboard_info_free (monitor->details->info);
+		monitor->details->info = NULL;
+	}
+
+	monitor->details->info = nautilus_clipboard_info_copy (info);
 
+	g_signal_emit (monitor, signals[CLIPBOARD_INFO], 0, monitor->details->info);
+	
+	nautilus_clipboard_monitor_emit_changed ();
 }
 
+NautilusClipboardInfo *
+nautilus_clipboard_monitor_get_clipboard_info (NautilusClipboardMonitor *monitor)
+{
+	return monitor->details->info;
+}
+
+void
+nautilus_clear_clipboard_callback (GtkClipboard *clipboard,
+                                   gpointer      user_data)
+{
+	nautilus_clipboard_monitor_set_clipboard_info 
+		(nautilus_clipboard_monitor_get (), NULL);
+}
+
+static char *
+convert_file_list_to_string (NautilusClipboardInfo *info,
+			     gboolean format_for_text,
+                             gsize *len)
+{
+	GString *uris;
+	char *uri, *tmp;
+	GFile *f;
+        guint i;
+	GList *l;
+
+	if (format_for_text) {
+		uris = g_string_new (NULL);
+	} else {
+		uris = g_string_new (info->cut ? "cut" : "copy");
+	}
+
+        for (i = 0, l = info->files; l != NULL; l = l->next, i++) {
+		uri = nautilus_file_get_uri (l->data);
+
+		if (format_for_text) {
+			f = g_file_new_for_uri (uri);
+			tmp = g_file_get_parse_name (f);
+			g_object_unref (f);
+			
+			if (tmp != NULL) {
+				g_string_append (uris, tmp);
+				g_free (tmp);
+			} else {
+				g_string_append (uris, uri);
+			}
+
+			/* skip newline for last element */
+			if (i + 1 < g_list_length (info->files)) {
+				g_string_append_c (uris, '\n');
+			}
+		} else {
+			g_string_append_c (uris, '\n');
+			g_string_append (uris, uri);
+		}
+
+		g_free (uri);
+	}
+
+        *len = uris->len;
+	return g_string_free (uris, FALSE);
+}
+
+void
+nautilus_get_clipboard_callback (GtkClipboard     *clipboard,
+                                 GtkSelectionData *selection_data,
+                                 guint             info,
+                                 gpointer          user_data)
+{
+	char **uris;
+	GList *l;
+	int i;
+	NautilusClipboardInfo *clipboard_info;
+
+	clipboard_info =
+		nautilus_clipboard_monitor_get_clipboard_info (nautilus_clipboard_monitor_get ());
+
+        if (gtk_targets_include_uri (&selection_data->target, 1)) {
+		uris = g_malloc ((g_list_length (clipboard_info->files) + 1) * sizeof (char *));
+		i = 0;
+
+		for (l = clipboard_info->files; l != NULL; l = l->next) {
+			uris[i] = nautilus_file_get_uri (l->data);
+			i++;
+		}
+
+		uris[i] = NULL;
+
+		gtk_selection_data_set_uris (selection_data, uris);
+
+		g_strfreev (uris);
+        } else if (gtk_targets_include_text (&selection_data->target, 1)) {
+                char *str;
+                gsize len;
+
+                str = convert_file_list_to_string (clipboard_info, TRUE, &len);
+                gtk_selection_data_set_text (selection_data, str, len);
+                g_free (str);
+        } else if (selection_data->target == copied_files_atom) {
+                char *str;
+                gsize len;
+
+                str = convert_file_list_to_string (clipboard_info, FALSE, &len);
+                gtk_selection_data_set (selection_data, copied_files_atom, 8, str, len);
+                g_free (str);
+        }
+}
diff --git a/libnautilus-private/nautilus-clipboard-monitor.h b/libnautilus-private/nautilus-clipboard-monitor.h
index 2a48078..e56e418 100644
--- a/libnautilus-private/nautilus-clipboard-monitor.h
+++ b/libnautilus-private/nautilus-clipboard-monitor.h
@@ -40,21 +40,43 @@
   (G_TYPE_INSTANCE_GET_CLASS ((obj), NAUTILUS_TYPE_CLIPBOARD_MONITOR, NautilusClipboardMonitorClass))
 
 typedef struct NautilusClipboardMonitorDetails NautilusClipboardMonitorDetails;
+typedef struct NautilusClipboardInfo NautilusClipboardInfo;
 
 typedef struct {
 	GObject parent_slot;
+
+	NautilusClipboardMonitorDetails *details;
 } NautilusClipboardMonitor;
 
 typedef struct {
 	GObjectClass parent_slot;
   
 	void (* clipboard_changed) (NautilusClipboardMonitor *monitor);
+	void (* clipboard_info) (NautilusClipboardMonitor *monitor,
+	                         NautilusClipboardInfo *info);
 } NautilusClipboardMonitorClass;
 
+struct NautilusClipboardInfo {
+	GList *files;
+	gboolean cut;
+};
+
 GType   nautilus_clipboard_monitor_get_type (void);
 
 NautilusClipboardMonitor *   nautilus_clipboard_monitor_get (void);
+void nautilus_clipboard_monitor_set_clipboard_info (NautilusClipboardMonitor *monitor,
+                                                    NautilusClipboardInfo *info);
+NautilusClipboardInfo * nautilus_clipboard_monitor_get_clipboard_info (NautilusClipboardMonitor *monitor);
 void nautilus_clipboard_monitor_emit_changed (void);
 
+void nautilus_clear_clipboard_callback (GtkClipboard *clipboard,
+                                        gpointer      user_data);
+void nautilus_get_clipboard_callback   (GtkClipboard     *clipboard,
+                                        GtkSelectionData *selection_data,
+                                        guint             info,
+                                        gpointer          user_data);
+
+
+
 #endif /* NAUTILUS_CLIPBOARD_MONITOR_H */
 
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index d3f5fe9..ff986df 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -1987,6 +1987,24 @@ nautilus_file_matches_uri (NautilusFile *file, const char *match_uri)
 	return result;
 }
 
+int
+nautilus_file_compare_location (NautilusFile *file_1,
+                                NautilusFile *file_2)
+{
+	GFile *loc_a, *loc_b;
+	gboolean res;
+
+	loc_a = nautilus_file_get_location (file_1);
+	loc_b = nautilus_file_get_location (file_2);
+
+	res = !g_file_equal (loc_a, loc_b);
+
+	g_object_unref (loc_a);
+	g_object_unref (loc_b);
+
+	return (gint) res;
+}
+
 gboolean
 nautilus_file_is_local (NautilusFile *file)
 {
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index 8c86ae2..82865c4 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -409,6 +409,8 @@ gboolean                nautilus_file_is_date_sort_attribute_q          (GQuark
 
 int                     nautilus_file_compare_display_name              (NautilusFile                   *file_1,
 									 const char                     *pattern);
+int                     nautilus_file_compare_location                  (NautilusFile                    *file_1,
+                                                                         NautilusFile                    *file_2);
 
 /* filtering functions for use by various directory views */
 gboolean                nautilus_file_is_hidden_file                    (NautilusFile                   *file);
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index 8587e7d..f6c0b93 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -117,12 +117,14 @@ struct NautilusIconCanvasItemDetails {
    	guint is_highlighted_for_selection : 1;
 	guint is_highlighted_as_keyboard_focus: 1;
    	guint is_highlighted_for_drop : 1;
+	guint is_highlighted_for_clipboard : 1;
 	guint show_stretch_handles : 1;
 	guint is_prelit : 1;
 
 	guint rendered_is_active : 1;
 	guint rendered_is_highlighted_for_selection : 1;
 	guint rendered_is_highlighted_for_drop : 1;
+	guint rendered_is_highlighted_for_clipboard : 1;
 	guint rendered_is_prelit : 1;
 	guint rendered_is_focused : 1;
 	
@@ -160,7 +162,8 @@ enum {
 	PROP_ADDITIONAL_TEXT,
     	PROP_HIGHLIGHTED_FOR_SELECTION,
     	PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS,
-    	PROP_HIGHLIGHTED_FOR_DROP
+    	PROP_HIGHLIGHTED_FOR_DROP,
+	PROP_HIGHLIGHTED_FOR_CLIPBOARD
 };
 
 typedef enum {
@@ -243,7 +246,6 @@ static void      draw_embedded_text                  (NautilusIconCanvasItem
 						      int                            x,
 						      int                            y);
 
-static GdkPixbuf *nautilus_icon_canvas_lighten_pixbuf (GdkPixbuf* src, guint lighten_value);
 static void       nautilus_icon_canvas_item_ensure_bounds_up_to_date (NautilusIconCanvasItem *icon_item);
 
 
@@ -447,7 +449,14 @@ nautilus_icon_canvas_item_set_property (GObject        *object,
 		}
 		details->is_highlighted_for_drop = g_value_get_boolean (value);
 		break;
-		
+
+	case PROP_HIGHLIGHTED_FOR_CLIPBOARD:
+		if (!details->is_highlighted_for_clipboard == !g_value_get_boolean (value)) {
+			return;
+		}
+		details->is_highlighted_for_clipboard = g_value_get_boolean (value);
+		break;
+
 	default:
 		g_warning ("nautilus_icons_view_item_item_set_arg on unknown argument");
 		return;
@@ -489,6 +498,10 @@ nautilus_icon_canvas_item_get_property (GObject        *object,
 		g_value_set_boolean (value, details->is_highlighted_for_drop);
                 break;
 
+	case PROP_HIGHLIGHTED_FOR_CLIPBOARD:
+		g_value_set_boolean (value, details->is_highlighted_for_clipboard);
+                break;
+
         default:
 		g_warning ("invalid property %d", property_id);
 		break;
@@ -1692,112 +1705,6 @@ draw_pixbuf (GdkPixbuf *pixbuf, GdkDrawable *drawable, int x, int y)
 			 GDK_RGB_DITHER_NORMAL, 0, 0);
 }
 
-/* should be moved to libeel! */
-static guchar
-nautilus_icon_canvas_lighten_pixbuf_component (guchar cur_value, guint lighten_value) {
-	int new_value = cur_value;
-	if (lighten_value > 0) {
-		new_value += lighten_value + (new_value >> 3);
-		if (new_value > 255) {
-			new_value = 255;
-		}
-	}
-	return (guchar) new_value;
-}
-
-/* should be moved to libeel! */
-static GdkPixbuf *
-nautilus_icon_canvas_lighten_pixbuf (GdkPixbuf* src, guint lighten_value) {
-	GdkPixbuf *dest;
-	int i, j;
-	int width, height, has_alpha, src_row_stride, dst_row_stride;
-	guchar *target_pixels, *original_pixels;
-	guchar *pixsrc, *pixdest;
-
-	g_assert (gdk_pixbuf_get_colorspace (src) == GDK_COLORSPACE_RGB);
-	g_assert ((!gdk_pixbuf_get_has_alpha (src)
-			       && gdk_pixbuf_get_n_channels (src) == 3)
-			      || (gdk_pixbuf_get_has_alpha (src)
-				  && gdk_pixbuf_get_n_channels (src) == 4));
-	g_assert (gdk_pixbuf_get_bits_per_sample (src) == 8);
-
-	dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
-			       gdk_pixbuf_get_has_alpha (src),
-			       gdk_pixbuf_get_bits_per_sample (src),
-			       gdk_pixbuf_get_width (src),
-			       gdk_pixbuf_get_height (src));
-	
-	has_alpha = gdk_pixbuf_get_has_alpha (src);
-	width = gdk_pixbuf_get_width (src);
-	height = gdk_pixbuf_get_height (src);
-	dst_row_stride = gdk_pixbuf_get_rowstride (dest);
-	src_row_stride = gdk_pixbuf_get_rowstride (src);
-	target_pixels = gdk_pixbuf_get_pixels (dest);
-	original_pixels = gdk_pixbuf_get_pixels (src);
-
-	for (i = 0; i < height; i++) {
-		pixdest = target_pixels + i * dst_row_stride;
-		pixsrc = original_pixels + i * src_row_stride;
-		for (j = 0; j < width; j++) {		
-			*pixdest++ = nautilus_icon_canvas_lighten_pixbuf_component (*pixsrc++, lighten_value);
-			*pixdest++ = nautilus_icon_canvas_lighten_pixbuf_component (*pixsrc++, lighten_value);
-			*pixdest++ = nautilus_icon_canvas_lighten_pixbuf_component (*pixsrc++, lighten_value);
-			if (has_alpha) {
-				*pixdest++ = *pixsrc++;
-			}
-		}
-	}
-	return dest;
-}
-
-
-
-static GdkPixbuf *
-render_icon (GdkPixbuf *pixbuf, guint render_mode, guint saturation, guint brightness, guint lighten_value, guint color)
-{
- 	GdkPixbuf *temp_pixbuf, *old_pixbuf;
-
-	if (render_mode == 1) {
-	/* lighten icon */
-		temp_pixbuf = eel_create_spotlight_pixbuf (pixbuf);
-	}
-	else if (render_mode == 2) {
-	/* colorize icon */
-		temp_pixbuf = eel_create_colorized_pixbuf (pixbuf,
-				   EEL_RGBA_COLOR_GET_R (color),
-				   EEL_RGBA_COLOR_GET_G (color),
-				   EEL_RGBA_COLOR_GET_B (color));
-	} else if (render_mode == 3) {
-	/* monochromely colorize icon */
-		old_pixbuf = eel_create_darkened_pixbuf (pixbuf, 0, 255);		
-		temp_pixbuf = eel_create_colorized_pixbuf (old_pixbuf,
-				   EEL_RGBA_COLOR_GET_R (color),
-				   EEL_RGBA_COLOR_GET_G (color),
-				   EEL_RGBA_COLOR_GET_B (color));
-		g_object_unref (old_pixbuf);
-	} else {
-		temp_pixbuf = NULL;
-	}
-
-	if (saturation < 255 || brightness < 255 || temp_pixbuf == NULL) { // temp_pixbuf == NULL just for safer code (return copy)
-		old_pixbuf = temp_pixbuf;
-		temp_pixbuf = eel_create_darkened_pixbuf (temp_pixbuf ? temp_pixbuf : pixbuf, saturation, brightness);
-		if (old_pixbuf) {
-			g_object_unref (old_pixbuf);
-		}
-	}
-
-	if (lighten_value > 0) {
-		old_pixbuf = temp_pixbuf;
-  		temp_pixbuf = nautilus_icon_canvas_lighten_pixbuf (temp_pixbuf ? temp_pixbuf : pixbuf, lighten_value);
-		if (old_pixbuf) {
-			g_object_unref (old_pixbuf);
-		}
-	}
-
-	return temp_pixbuf;
-}
-
 /* shared code to highlight or dim the passed-in pixbuf */
 static GdkPixbuf *
 real_map_pixbuf (NautilusIconCanvasItem *icon_item)
@@ -1815,7 +1722,8 @@ real_map_pixbuf (NautilusIconCanvasItem *icon_item)
 
 	g_object_ref (temp_pixbuf);
 
-	if (icon_item->details->is_prelit) {
+	if (icon_item->details->is_prelit ||
+	    icon_item->details->is_highlighted_for_clipboard) {
 		old_pixbuf = temp_pixbuf;
 
 		gtk_widget_style_get (GTK_WIDGET (container),
@@ -1826,12 +1734,12 @@ real_map_pixbuf (NautilusIconCanvasItem *icon_item)
 			      NULL);
 
 		if (render_mode > 0 || saturation < 255 || brightness < 255) {
-			temp_pixbuf = render_icon (temp_pixbuf,
-				render_mode,
-				saturation,
-				brightness,
-				lighten,
-				container->details->prelight_icon_color_rgba);
+			temp_pixbuf = eel_gdk_pixbuf_render (temp_pixbuf,
+					render_mode,
+					saturation,
+					brightness,
+					lighten,
+					container->details->prelight_icon_color_rgba);
 			g_object_unref (old_pixbuf);
        	}
 
@@ -1907,7 +1815,7 @@ real_map_pixbuf (NautilusIconCanvasItem *icon_item)
 			      NULL);
 		if (render_mode > 0 || saturation < 255 || brightness < 255) {
 			/* if theme requests colorization */
-			temp_pixbuf = render_icon (temp_pixbuf,
+			temp_pixbuf = eel_gdk_pixbuf_render (temp_pixbuf,
 					    render_mode,
 					    saturation,
 					    brightness,
@@ -1928,6 +1836,7 @@ map_pixbuf (NautilusIconCanvasItem *icon_item)
 	      && icon_item->details->rendered_is_prelit == icon_item->details->is_prelit
 	      && icon_item->details->rendered_is_highlighted_for_selection == icon_item->details->is_highlighted_for_selection
 	      && icon_item->details->rendered_is_highlighted_for_drop == icon_item->details->is_highlighted_for_drop
+	      && icon_item->details->rendered_is_highlighted_for_clipboard == icon_item->details->is_highlighted_for_clipboard
 	      && (icon_item->details->is_highlighted_for_selection && icon_item->details->rendered_is_focused == gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (icon_item)->canvas))))) {
 		if (icon_item->details->rendered_pixbuf != NULL) {
 			g_object_unref (icon_item->details->rendered_pixbuf);
@@ -1937,6 +1846,7 @@ map_pixbuf (NautilusIconCanvasItem *icon_item)
 		icon_item->details->rendered_is_prelit = icon_item->details->is_prelit;
 		icon_item->details->rendered_is_highlighted_for_selection = icon_item->details->is_highlighted_for_selection;
 		icon_item->details->rendered_is_highlighted_for_drop = icon_item->details->is_highlighted_for_drop;
+	        icon_item->details->rendered_is_highlighted_for_clipboard = icon_item->details->is_highlighted_for_clipboard;
 		icon_item->details->rendered_is_focused = gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (icon_item)->canvas));
 	}
 
@@ -3625,7 +3535,15 @@ nautilus_icon_canvas_item_class_init (NautilusIconCanvasItemClass *class)
 		g_param_spec_boolean ("highlighted_for_drop",
 				      "highlighted for drop",
 				      "whether we are highlighted for a D&D drop",
-				      FALSE, G_PARAM_READWRITE)); 
+				      FALSE, G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_HIGHLIGHTED_FOR_CLIPBOARD,
+		g_param_spec_boolean ("highlighted_for_clipboard",
+				      "highlighted for clipboard",
+				      "whether we are highlighted for a clipboard paste (after we have been cut)",
+ 				      FALSE, G_PARAM_READWRITE));
 
 	item_class->update = nautilus_icon_canvas_item_update;
 	item_class->draw = nautilus_icon_canvas_item_draw;
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index 5f06f5c..c554c8c 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -8946,6 +8946,33 @@ nautilus_icon_container_set_all_columns_same_width (NautilusIconContainer *conta
 	}
 }
 
+/**
+ * nautilus_icon_container_set_highlighted_for_clipboard
+ * @container: An icon container widget.
+ * @data: Icon Data associated with all icons that should be highlighted.
+ *        Others will be unhighlighted.
+ **/
+void
+nautilus_icon_container_set_highlighted_for_clipboard (NautilusIconContainer *container,
+						       GList                 *clipboard_icon_data)
+{
+	GList *l;
+	NautilusIcon *icon;
+	gboolean highlighted_for_clipboard;
+
+	g_return_if_fail (NAUTILUS_IS_ICON_CONTAINER (container));
+
+	for (l = container->details->icons; l != NULL; l = l->next) {
+		icon = l->data;
+		highlighted_for_clipboard = (g_list_find (clipboard_icon_data, icon->data) != NULL);
+
+		eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item),
+				     "highlighted-for-clipboard", highlighted_for_clipboard,
+				     NULL);
+	}
+
+}
+
 /* NautilusIconContainerAccessible */
 
 static NautilusIconContainerAccessiblePrivate *
diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h
index 0ec896d..b5f0dce 100644
--- a/libnautilus-private/nautilus-icon-container.h
+++ b/libnautilus-private/nautilus-icon-container.h
@@ -285,6 +285,8 @@ void              nautilus_icon_container_freeze_icon_positions         (Nautilu
 int               nautilus_icon_container_get_max_layout_lines           (NautilusIconContainer  *container);
 int               nautilus_icon_container_get_max_layout_lines_for_pango (NautilusIconContainer  *container);
 
+void              nautilus_icon_container_set_highlighted_for_clipboard (NautilusIconContainer  *container,
+									 GList                  *clipboard_icon_data);
 
 /* operations on all icons */
 void              nautilus_icon_container_unselect_all                  (NautilusIconContainer  *view);
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index c91e070..24b24a9 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -596,7 +596,6 @@ fm_directory_view_get_nautilus_window_slot (FMDirectoryView  *view)
 	return view->details->slot;
 }
 
-
 /* Returns the GtkWindow that this directory view occupies, or NULL
  * if at the moment this directory view is not in a GtkWindow or the
  * GtkWindow cannot be determined. Primarily used for parenting dialogs.
@@ -5753,114 +5752,6 @@ create_popup_menu (FMDirectoryView *view, const char *popup_path)
 
 	return GTK_MENU (menu);
 }
-
-typedef struct {
-	char **file_uris;
-        guint n_file_uris;
-	gboolean cut;
-} ClipboardInfo;
-
-static char *
-convert_file_list_to_string (ClipboardInfo *info,
-			     gboolean format_for_text,
-                             gsize *len)
-{
-	GString *uris;
-	char *uri, *tmp;
-	GFile *f;
-        guint i;
-
-	if (format_for_text) {
-		uris = g_string_new (NULL);
-	} else {
-		uris = g_string_new (info->cut ? "cut" : "copy");
-	}
-
-        for (i = 0; i < info->n_file_uris; ++i) {
-		uri = info->file_uris[i];
-		
-		if (format_for_text) {
-			f = g_file_new_for_uri (uri);
-			tmp = g_file_get_parse_name (f);
-			g_object_unref (f);
-			
-			if (tmp != NULL) {
-				g_string_append (uris, tmp);
-				g_free (tmp);
-			} else {
-				g_string_append (uris, uri);
-			}
-
-			/* skip newline for last element */
-			if (i + 1 < info->n_file_uris) {
-				g_string_append_c (uris, '\n');
-			}
-		} else {
-			g_string_append_c (uris, '\n');
-			g_string_append (uris, uri);
-		}
-	}
-
-        *len = uris->len;
-	return g_string_free (uris, FALSE);
-}
-
-static void
-get_clipboard_callback (GtkClipboard     *clipboard,
-			GtkSelectionData *selection_data,
-			guint             info,
-			gpointer          user_data)
-{
-	ClipboardInfo *clipboard_info = user_data;
-
-        if (gtk_targets_include_uri (&selection_data->target, 1)) {
-                gtk_selection_data_set_uris (selection_data, clipboard_info->file_uris);
-        } else if (gtk_targets_include_text (&selection_data->target, 1)) {
-                char *str;
-                gsize len;
-
-                str = convert_file_list_to_string (clipboard_info, TRUE, &len);
-                gtk_selection_data_set_text (selection_data, str, len);
-                g_free (str);
-        } else if (selection_data->target == copied_files_atom) {
-                char *str;
-                gsize len;
-
-                str = convert_file_list_to_string (clipboard_info, FALSE, &len);
-                gtk_selection_data_set (selection_data, copied_files_atom, 8, str, len);
-                g_free (str);
-        }
-}
-
-static void
-clear_clipboard_callback (GtkClipboard *clipboard,
-			  gpointer      user_data)
-{
-	ClipboardInfo *info = user_data;
-
-        g_strfreev (info->file_uris);
-	g_slice_free (ClipboardInfo, info);
-}
-
-static ClipboardInfo *
-convert_file_list_to_uris (GList *files,
-                           gboolean cut)
-{
-        ClipboardInfo *info;
-        guint i;
-
-	info = g_slice_new (ClipboardInfo);
-        info->cut = cut;
-        info->n_file_uris = g_list_length (files);
-        info->file_uris = g_new (char *, info->n_file_uris + 1);
-
-        for (i = 0; files != NULL; files = files->next, ++i)
-                info->file_uris[i] = nautilus_file_get_uri (files->data);
-
-        info->file_uris[info->n_file_uris] = NULL;
-
-        return info;
-}
 	
 static void
 copy_or_cut_files (FMDirectoryView *view,
@@ -5869,12 +5760,13 @@ copy_or_cut_files (FMDirectoryView *view,
 {
 	int count;
 	char *status_string, *name;
-	ClipboardInfo *info;
+	NautilusClipboardInfo info;
         GtkTargetList *target_list;
         GtkTargetEntry *targets;
         int n_targets;
 
-	info = convert_file_list_to_uris (clipboard_contents, cut);
+	info.files = clipboard_contents;
+	info.cut = cut;
 
         target_list = gtk_target_list_new (NULL, 0);
         gtk_target_list_add (target_list, copied_files_atom, 0, 0);
@@ -5886,11 +5778,11 @@ copy_or_cut_files (FMDirectoryView *view,
 
 	gtk_clipboard_set_with_data (nautilus_clipboard_get (GTK_WIDGET (view)),
 				     targets, n_targets,
-				     get_clipboard_callback, clear_clipboard_callback,
-				     info);
+				     nautilus_get_clipboard_callback, nautilus_clear_clipboard_callback,
+				     NULL);
         gtk_target_table_free (targets, n_targets);
 
-	nautilus_clipboard_monitor_emit_changed ();
+	nautilus_clipboard_monitor_set_clipboard_info (nautilus_clipboard_monitor_get (), &info);
 
 	count = g_list_length (clipboard_contents);
 	if (count == 1) {
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index 782e89f..3972463 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -42,6 +42,7 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <gio/gio.h>
+#include <libnautilus-private/nautilus-clipboard-monitor.h>
 #include <libnautilus-private/nautilus-directory-background.h>
 #include <libnautilus-private/nautilus-directory.h>
 #include <libnautilus-private/nautilus-dnd.h>
@@ -108,6 +109,8 @@ struct FMIconViewDetails
 	int num_screens;
 
 	gboolean compact;
+
+	gulong clipboard_handler_id;
 };
 
 
@@ -205,6 +208,12 @@ fm_icon_view_destroy (GtkObject *object)
 		icon_view->details->react_to_icon_change_idle_id = 0;
         }
 
+	if (icon_view->details->clipboard_handler_id != 0) {
+		g_signal_handler_disconnect (nautilus_clipboard_monitor_get (),
+					     icon_view->details->clipboard_handler_id);
+		icon_view->details->clipboard_handler_id = 0;
+	}
+
 	/* kill any sound preview process that is ongoing */
 	preview_audio (icon_view, NULL, FALSE);
 
@@ -1213,16 +1222,39 @@ fm_icon_view_begin_loading (FMDirectoryView *view)
 }
 
 static void
+icon_view_notify_clipboard_info (NautilusClipboardMonitor *monitor,
+                                 NautilusClipboardInfo *info,
+                                 FMIconView *icon_view)
+{
+	GList *icon_data;
+
+	icon_data = NULL;
+	if (info && info->cut) {
+		icon_data = info->files;
+	}
+
+	nautilus_icon_container_set_highlighted_for_clipboard (
+		get_icon_container (icon_view), icon_data);
+}
+
+static void
 fm_icon_view_end_loading (FMDirectoryView *view,
 			  gboolean all_files_seen)
 {
 	FMIconView *icon_view;
 	GtkWidget *icon_container;
+	NautilusClipboardMonitor *monitor;
+	NautilusClipboardInfo *info;
 
 	icon_view = FM_ICON_VIEW (view);
 
 	icon_container = GTK_WIDGET (get_icon_container (icon_view));
 	nautilus_icon_container_end_loading (NAUTILUS_ICON_CONTAINER (icon_container), all_files_seen);
+
+	monitor = nautilus_clipboard_monitor_get ();
+	info = nautilus_clipboard_monitor_get_clipboard_info (monitor);
+
+	icon_view_notify_clipboard_info (monitor, info, icon_view);
 }
 
 static NautilusZoomLevel
@@ -3037,6 +3069,11 @@ fm_icon_view_init (FMIconView *icon_view)
 				 G_CALLBACK (icon_view_handle_text), icon_view, 0);
 	g_signal_connect_object (get_icon_container (icon_view), "handle_raw",
 				 G_CALLBACK (icon_view_handle_raw), icon_view, 0);
+
+	icon_view->details->clipboard_handler_id = 
+		g_signal_connect (nautilus_clipboard_monitor_get (),
+		                  "clipboard_info",
+		                  G_CALLBACK (icon_view_notify_clipboard_info), icon_view);
 }
 
 static NautilusView *
diff --git a/src/file-manager/fm-list-model.c b/src/file-manager/fm-list-model.c
index 5e235fb..aad068e 100644
--- a/src/file-manager/fm-list-model.c
+++ b/src/file-manager/fm-list-model.c
@@ -75,6 +75,8 @@ struct FMListModelDetails {
 	int drag_begin_y;
 
 	GPtrArray *columns;
+
+	GList *highlight_files;
 };
 
 typedef struct {
@@ -253,7 +255,7 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column
 	FileEntry *file_entry;
 	NautilusFile *file;
 	char *str;
-	GdkPixbuf *icon;
+	GdkPixbuf *icon, *rendered_icon;
 	int icon_size;
 	guint emblem_size;
 	NautilusZoomLevel zoom_level;
@@ -317,7 +319,19 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column
 			}
 
 			icon = nautilus_file_get_icon_pixbuf (file, icon_size, TRUE, flags);
-  
+
+			if (model->details->highlight_files != NULL &&
+			    g_list_find_custom (model->details->highlight_files,
+			                        file, (GCompareFunc) nautilus_file_compare_location))
+			{
+				rendered_icon = eel_gdk_pixbuf_render (icon, 1, 255, 255, 0, 0);
+
+				if (rendered_icon != NULL) {
+					g_object_unref (icon);
+					icon = rendered_icon;
+				}
+			}
+
 			g_value_set_object (value, icon);
 			g_object_unref (icon);
 		}
@@ -1553,6 +1567,11 @@ fm_list_model_finalize (GObject *object)
 
 	model = FM_LIST_MODEL (object);
 
+	if (model->details->highlight_files != NULL) {
+		nautilus_file_list_free (model->details->highlight_files);
+		model->details->highlight_files = NULL;
+	}
+
 	g_free (model->details);
 
 	G_OBJECT_CLASS (fm_list_model_parent_class)->finalize (object);
@@ -1668,3 +1687,45 @@ fm_list_model_subdirectory_done_loading (FMListModel *model, NautilusDirectory *
 		}
 	}
 }
+
+static void
+refresh_row (gpointer data,
+             gpointer user_data)
+{
+	NautilusFile *file;
+	FMListModel *model;
+	GList *iters, *l;
+	GtkTreePath *path;
+
+	model = user_data;
+	file = data;
+
+	iters = fm_list_model_get_all_iters_for_file (model, file);
+	for (l = iters; l != NULL; l = l->next) {
+		path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), l->data);
+		gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, l->data);
+
+		gtk_tree_path_free (path);
+	}
+
+	eel_g_list_free_deep (iters);
+}
+
+void
+fm_list_model_set_highlight_for_files (FMListModel *model,
+                                       GList *files)
+{
+	if (model->details->highlight_files != NULL) {
+		g_list_foreach (model->details->highlight_files,
+		                refresh_row, model);
+		nautilus_file_list_free (model->details->highlight_files);
+		model->details->highlight_files = NULL;
+	}
+
+	if (files != NULL) {
+		model->details->highlight_files = nautilus_file_list_copy (files);
+		g_list_foreach (model->details->highlight_files,
+		                refresh_row, model);
+
+	}
+}
diff --git a/src/file-manager/fm-list-model.h b/src/file-manager/fm-list-model.h
index d6a6b14..b01fee8 100644
--- a/src/file-manager/fm-list-model.h
+++ b/src/file-manager/fm-list-model.h
@@ -138,5 +138,8 @@ int               fm_list_model_get_column_number (FMListModel *model,
 						   
 void              fm_list_model_subdirectory_done_loading (FMListModel       *model,
 							   NautilusDirectory *directory);
+
+void              fm_list_model_set_highlight_for_files (FMListModel *model,
+                                                         GList *files);
 						   
 #endif /* FM_LIST_MODEL_H */
diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c
index 1bab954..c307c5a 100644
--- a/src/file-manager/fm-list-view.c
+++ b/src/file-manager/fm-list-view.c
@@ -33,6 +33,7 @@
 #include "fm-list-model.h"
 #include <string.h>
 #include <eel/eel-vfs-extensions.h>
+#include <eel/eel-gdk-extensions.h>
 #include <eel/eel-glib-extensions.h>
 #include <eel/eel-gtk-macros.h>
 #include <gdk/gdk.h>
@@ -42,6 +43,7 @@
 #include <glib/gi18n.h>
 #include <glib-object.h>
 #include <libnautilus-extension/nautilus-column-provider.h>
+#include <libnautilus-private/nautilus-clipboard-monitor.h>
 #include <libnautilus-private/nautilus-column-chooser.h>
 #include <libnautilus-private/nautilus-column-utilities.h>
 #include <libnautilus-private/nautilus-debug-log.h>
@@ -104,6 +106,8 @@ struct FMListViewDetails {
 	gboolean rename_done;
 	guint renaming_file_activate_timeout;
 
+	gulong clipboard_handler_id;
+
 	GQuark last_sort_attr;
 };
 
@@ -2757,6 +2761,12 @@ fm_list_view_dispose (GObject *object)
 		list_view->details->renaming_file_activate_timeout = 0;
 	}
 
+	if (list_view->details->clipboard_handler_id != 0) {
+		g_signal_handler_disconnect (nautilus_clipboard_monitor_get (),
+		                             list_view->details->clipboard_handler_id);
+		list_view->details->clipboard_handler_id = 0;
+	}
+
 	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
@@ -2880,6 +2890,31 @@ list_view_scroll_to_file (NautilusView *view,
 }
 
 static void
+list_view_notify_clipboard_info (NautilusClipboardMonitor *monitor,
+                                 NautilusClipboardInfo *info,
+                                 FMListView *view)
+{
+	if (info != NULL && info->cut) {
+		fm_list_model_set_highlight_for_files (view->details->model, info->files);
+	} else {
+		fm_list_model_set_highlight_for_files (view->details->model, NULL);
+	}
+}
+
+static void
+fm_list_view_end_loading (FMDirectoryView *view,
+                          gboolean all_files_seen)
+{
+	NautilusClipboardMonitor *monitor;
+	NautilusClipboardInfo *info;
+
+	monitor = nautilus_clipboard_monitor_get ();
+	info = nautilus_clipboard_monitor_get_clipboard_info (monitor);
+
+	list_view_notify_clipboard_info (monitor, info, FM_LIST_VIEW (view));
+}
+
+static void
 real_set_is_active (FMDirectoryView *view,
 		    gboolean is_active)
 {
@@ -2913,6 +2948,7 @@ fm_list_view_class_init (FMListViewClass *class)
 
 	fm_directory_view_class->add_file = fm_list_view_add_file;
 	fm_directory_view_class->begin_loading = fm_list_view_begin_loading;
+	fm_directory_view_class->end_loading = fm_list_view_end_loading;
 	fm_directory_view_class->bump_zoom_level = fm_list_view_bump_zoom_level;
 	fm_directory_view_class->can_zoom_in = fm_list_view_can_zoom_in;
 	fm_directory_view_class->can_zoom_out = fm_list_view_can_zoom_out;
@@ -3008,6 +3044,10 @@ fm_list_view_init (FMListView *list_view)
 	list_view->details->zoom_level = NAUTILUS_ZOOM_LEVEL_SMALLEST - 1;
 
 	list_view->details->hover_path = NULL;
+	list_view->details->clipboard_handler_id = 
+		g_signal_connect (nautilus_clipboard_monitor_get (),
+		                  "clipboard_info",
+		                  G_CALLBACK (list_view_notify_clipboard_info), list_view);
 }
 
 static NautilusView *
diff --git a/src/file-manager/fm-tree-model.c b/src/file-manager/fm-tree-model.c
index c058bc1..7804d97 100644
--- a/src/file-manager/fm-tree-model.c
+++ b/src/file-manager/fm-tree-model.c
@@ -100,6 +100,8 @@ struct FMTreeModelDetails {
 	gboolean show_hidden_files;
 	gboolean show_backup_files;
 	gboolean show_only_directories;
+
+	GList *highlighted_files;
 };
 
 struct FMTreeModelRoot {
@@ -260,20 +262,37 @@ get_menu_icon (GIcon *icon)
 }
 
 static GdkPixbuf *
-get_menu_icon_for_file (NautilusFile *file,
+get_menu_icon_for_file (TreeNode *node,
+                        NautilusFile *file,
 			NautilusFileIconFlags flags)
 {
 	NautilusIconInfo *info;
-	GdkPixbuf *pixbuf;
+	GdkPixbuf *pixbuf, *retval;
+	gboolean highlight;
 	int size;
+	FMTreeModel *model;
 
 	size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
-	
+
 	info = nautilus_file_get_icon (file, size, flags);
-	pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
+	retval = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
+	model = node->root->model;
+
+	highlight = (g_list_find_custom (model->details->highlighted_files,
+	                                 file, (GCompareFunc) nautilus_file_compare_location) != NULL);
+
+	if (highlight) {
+		pixbuf = eel_gdk_pixbuf_render (retval, 1, 255, 255, 0, 0);
+
+		if (pixbuf != NULL) {
+			g_object_unref (retval);
+			retval = pixbuf;
+		}
+	}
+
 	g_object_unref (info);
-	
-	return pixbuf;
+
+	return retval;
 }
 
 static GdkPixbuf *
@@ -283,7 +302,7 @@ tree_node_get_pixbuf (TreeNode *node,
 	if (node->parent == NULL) {
 		return get_menu_icon (node->icon);
 	}
-	return get_menu_icon_for_file (node->file, flags);
+	return get_menu_icon_for_file (node, node->file, flags);
 }
 
 static gboolean
@@ -1816,6 +1835,51 @@ fm_tree_model_file_get_iter (FMTreeModel *model,
 }
 
 static void
+do_update_node (NautilusFile *file,
+                  FMTreeModel *model)
+{
+	TreeNode *root, *node = NULL;
+
+	for (root = model->details->root_node; root != NULL; root = root->next) {
+		node = get_node_from_file (root->root, file);
+
+		if (node != NULL) {
+			break;
+		}
+	}
+
+	if (node == NULL) {
+		return;
+	}
+
+	update_node (model, node);
+}
+
+void
+fm_tree_model_set_highlight_for_files (FMTreeModel *model,
+                                       GList *files)
+{
+	GList *old_files;
+
+	if (model->details->highlighted_files != NULL) {
+		old_files = model->details->highlighted_files;
+		model->details->highlighted_files = NULL;
+
+		g_list_foreach (old_files,
+		                (GFunc) do_update_node, model);
+
+		nautilus_file_list_free (old_files);
+	}
+
+	if (files != NULL) {
+		model->details->highlighted_files = 
+			nautilus_file_list_copy (files);
+		g_list_foreach (model->details->highlighted_files,
+		                (GFunc) do_update_node, model);
+	}
+}
+
+static void
 fm_tree_model_init (FMTreeModel *model)
 {
 	model->details = g_new0 (FMTreeModelDetails, 1);
@@ -1846,6 +1910,10 @@ fm_tree_model_finalize (GObject *object)
 		g_source_remove (model->details->monitoring_update_idle_id);
 	}
 
+	if (model->details->highlighted_files != NULL) {
+		nautilus_file_list_free (model->details->highlighted_files);
+	}
+
 	g_free (model->details);
 
 	G_OBJECT_CLASS (fm_tree_model_parent_class)->finalize (object);
diff --git a/src/file-manager/fm-tree-model.h b/src/file-manager/fm-tree-model.h
index 909d299..092ff90 100644
--- a/src/file-manager/fm-tree-model.h
+++ b/src/file-manager/fm-tree-model.h
@@ -95,5 +95,7 @@ gboolean           fm_tree_model_file_get_iter             (FMTreeModel *model,
 GMount *         fm_tree_model_get_mount_for_root_node_file        
                                                            (FMTreeModel  *model, 
                                                             NautilusFile *file);
+void             fm_tree_model_set_highlight_for_files    (FMTreeModel *model,
+                                                            GList *files);
 
 #endif /* FM_TREE_MODEL_H */
diff --git a/src/file-manager/fm-tree-view.c b/src/file-manager/fm-tree-view.c
index de9523d..fc63502 100644
--- a/src/file-manager/fm-tree-view.c
+++ b/src/file-manager/fm-tree-view.c
@@ -86,7 +86,8 @@ struct FMTreeViewDetails {
 	gboolean selecting;
 
 	guint show_selection_idle_id;
-	
+	gulong clipboard_handler_id;
+
 	GtkWidget *popup;
 	GtkWidget *popup_open;
 	GtkWidget *popup_open_in_new_window;
@@ -133,6 +134,19 @@ G_DEFINE_TYPE_WITH_CODE (FMTreeViewProvider, fm_tree_view_provider, G_TYPE_OBJEC
 			 G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_SIDEBAR_PROVIDER,
 						sidebar_provider_iface_init));
 
+static void
+notify_clipboard_info (NautilusClipboardMonitor *monitor,
+                       NautilusClipboardInfo *info,
+                       FMTreeView *view)
+{
+	if (info != NULL && info->cut) {
+		fm_tree_model_set_highlight_for_files (view->details->child_model, info->files);
+	} else {
+		fm_tree_model_set_highlight_for_files (view->details->child_model, NULL);
+	}
+}
+
+
 static gboolean
 show_iter_for_file (FMTreeView *view, NautilusFile *file, GtkTreeIter *iter)
 {
@@ -188,6 +202,18 @@ show_iter_for_file (FMTreeView *view, NautilusFile *file, GtkTreeIter *iter)
 	return FALSE;
 }
 
+static void
+refresh_highlight (FMTreeView *view)
+{
+	NautilusClipboardMonitor *monitor;
+	NautilusClipboardInfo *info;
+
+	monitor = nautilus_clipboard_monitor_get ();
+	info = nautilus_clipboard_monitor_get_clipboard_info (monitor);
+
+	notify_clipboard_info (monitor, info, view);
+}
+
 static gboolean
 show_selection_idle_callback (gpointer callback_data)
 {
@@ -232,6 +258,7 @@ show_selection_idle_callback (gpointer callback_data)
 	gtk_tree_path_free (sort_path);
 
 	nautilus_file_unref (file);
+	refresh_highlight (view);	
 
 	return FALSE;
 }
@@ -858,88 +885,19 @@ fm_tree_view_create_folder_cb (GtkWidget *menu_item,
 	g_free (parent_uri);
 }
 
-typedef struct {
-        char *file_uri;
-	gboolean cut;
-} ClipboardInfo;
-
-static void
-get_clipboard_callback (GtkClipboard	 *clipboard,
-			GtkSelectionData *selection_data,
-			guint		  info_,
-			gpointer	  user_data)
-{
-	ClipboardInfo *info = user_data;
-
-
-        if (gtk_targets_include_uri (&selection_data->target, 1)) {
-                char *uris[2];
-
-                uris[0] = info->file_uri;
-                uris[1] = NULL;
-                gtk_selection_data_set_uris (selection_data, uris);
-        } else if (gtk_targets_include_text (&selection_data->target, 1)) {
-                GFile *file;
-                char *str;
-
-                file = g_file_new_for_uri (info->file_uri);
-                str = g_file_get_parse_name (file);
-                g_object_unref (file);
-
-                if (str) {
-                        gtk_selection_data_set_text (selection_data, str, strlen (str));
-                        g_free (str);
-                } else {
-                        gtk_selection_data_set_text (selection_data,
-                                                    info->file_uri, strlen (info->file_uri));
-                }
-        } else if (selection_data->target == copied_files_atom) {
-                char *str;
-
-                str = g_strdup_printf ("%s\n%s",
-                                       info->cut ? "cut" : "copy",
-                                       info->file_uri);
-                gtk_selection_data_set (selection_data, copied_files_atom,
-                                        8, str, strlen (str));
-                g_free (str);
-        }
-}
-
-static void
-clear_clipboard_callback (GtkClipboard *clipboard,
-			  gpointer	user_data)
-{
-	ClipboardInfo *info = user_data;
-
-        g_free (info->file_uri);
-	g_slice_free (ClipboardInfo, info);
-}
-
-static ClipboardInfo *
-convert_file_to_uri (NautilusFile *file,
-		     gboolean cut)
-{
-        ClipboardInfo *info;
-
-        info = g_slice_new (ClipboardInfo);
-        info->cut = cut;
-	info->file_uri = nautilus_file_get_uri (file);
-
-        return info;
-}
-
 static void
 copy_or_cut_files (FMTreeView *view,
 		   gboolean cut)
 {
 	char *status_string, *name;
-        ClipboardInfo *info;
+	NautilusClipboardInfo info;
         GtkTargetList *target_list;
         GtkTargetEntry *targets;
         int n_targets;
 
-	info = convert_file_to_uri (view->details->popup_file, cut);
-	
+	info.cut = cut;
+	info.files = g_list_prepend (NULL, view->details->popup_file);
+
         target_list = gtk_target_list_new (NULL, 0);
         gtk_target_list_add (target_list, copied_files_atom, 0, 0);
         gtk_target_list_add_uri_targets (target_list, 0);
@@ -950,12 +908,14 @@ copy_or_cut_files (FMTreeView *view,
 
 	gtk_clipboard_set_with_data (nautilus_clipboard_get (GTK_WIDGET (view->details->tree_widget)),
 				     targets, n_targets,
-				     get_clipboard_callback, clear_clipboard_callback,
-				     info);
+				     nautilus_get_clipboard_callback, nautilus_clear_clipboard_callback,
+				     NULL);
         gtk_target_table_free (targets, n_targets);
 
-	nautilus_clipboard_monitor_emit_changed ();
-	
+	nautilus_clipboard_monitor_set_clipboard_info (nautilus_clipboard_monitor_get (),
+	                                               &info);
+	g_list_free (info.files);
+
 	name = nautilus_file_get_display_name (view->details->popup_file);
 	if (cut) {
 		status_string = g_strdup_printf (_("\"%s\" will be moved "
@@ -1541,6 +1501,11 @@ fm_tree_view_init (FMTreeView *view)
 						  filtering_changed_callback, view, G_OBJECT (view));
 	
 	view->details->popup_file = NULL;
+
+	view->details->clipboard_handler_id = 
+		g_signal_connect (nautilus_clipboard_monitor_get (),
+		                  "clipboard_info",
+		                  G_CALLBACK (notify_clipboard_info), view);
 }
 
 static void
@@ -1565,6 +1530,12 @@ fm_tree_view_dispose (GObject *object)
 		view->details->show_selection_idle_id = 0;
 	}
 
+	if (view->details->clipboard_handler_id != 0) {
+		g_signal_handler_disconnect (nautilus_clipboard_monitor_get (),
+		                             view->details->clipboard_handler_id);
+		view->details->clipboard_handler_id = 0;
+	}
+
 	cancel_activation (view);
 
 	if (view->details->popup != NULL) {
