--- orig/nautilus-2.27.92/libnautilus-private/nautilus-column-utilities.c	2009-05-23 20:13:29.000000000 +0200
+++ nautilus-2.27.92/libnautilus-private/nautilus-column-utilities.c	2009-09-14 19:52:42.000000000 +0200
@@ -128,6 +128,20 @@
 					       /* TODO: Change after string freeze over */
 					       "description", _("Location"),
 					       NULL));
+	columns = g_list_append (columns,
+				 g_object_new (NAUTILUS_TYPE_COLUMN,
+					       "name", "deletion_date",
+					       "attribute", "deletion_date",
+					       "label", _("Deleted On"),
+					       "description", _("When file was moved to Trash"),
+					       NULL));
+	columns = g_list_append (columns,
+				 g_object_new (NAUTILUS_TYPE_COLUMN,
+					       "name", "trashed_orig_path",
+					       "attribute", "trashed_orig_path",
+					       "label", _("Original Path"),
+					       "description", _("Original path of file before moved to Trash"),
+					       NULL));
 
 	return columns;
 }
--- orig/nautilus-2.27.92/libnautilus-private/nautilus-file.c	2009-08-17 15:24:11.000000000 +0200
+++ nautilus-2.27.92/libnautilus-private/nautilus-file.c	2009-09-14 19:50:58.000000000 +0200
@@ -129,6 +129,8 @@
 	attribute_deep_directory_count_q,
 	attribute_deep_total_count_q,
 	attribute_date_changed_q,
+	attribute_deletion_date_q,
+	attribute_deletion_orig_path_q,
 	attribute_date_permissions_q,
 	attribute_permissions_q,
 	attribute_selinux_context_q,
@@ -465,6 +467,7 @@
 	file->details->mtime = 0;
 	file->details->atime = 0;
 	file->details->ctime = 0;
+	file->details->trash_time = 0;
 	g_free (file->details->symlink_name);
 	file->details->symlink_name = NULL;
 	eel_ref_str_unref (file->details->mime_type);
@@ -2013,6 +2016,9 @@
 	goffset size;
 	int sort_order;
 	time_t atime, mtime, ctime;
+	time_t trash_time = 0;
+	GTimeVal g_trash_time;
+	const char * time_string;
 	const char *symlink_name, *mime_type, *selinux_context, *name, *thumbnail_path;
 	GFileType file_type;
 	GIcon *icon;
@@ -2376,6 +2382,16 @@
 		file->details->filesystem_id = eel_ref_str_get_unique (filesystem_id);
 	}
 
+	time_string = g_file_info_get_attribute_string (info, "trash::deletion-date");
+	if (time_string != NULL) {
+		g_time_val_from_iso8601 (time_string, &g_trash_time);
+		trash_time = g_trash_time.tv_sec;
+	}
+	if (trash_time && file->details->trash_time != trash_time) {
+		changed = TRUE;
+		file->details->trash_time = trash_time;
+	}
+
 	trash_orig_path = g_file_info_get_attribute_byte_string (info, "trash::orig-path");
 	if (eel_strcmp (file->details->trash_orig_path, trash_orig_path) != 0) {
 		changed = TRUE;
@@ -2629,6 +2645,9 @@
 	case NAUTILUS_DATE_TYPE_ACCESSED:
 		time = file->details->atime;
 		break;
+	case NAUTILUS_DATE_TYPE_TRASHED:
+		time = file->details->trash_time;
+		break;
 	default:
 		g_assert_not_reached ();
 		break;
@@ -3143,6 +3162,12 @@
 				result = compare_by_full_path (file_1, file_2);
 			}
 			break;
+		case NAUTILUS_FILE_SORT_BY_TRASHED_TIME:
+			result = compare_by_time (file_1, file_2, NAUTILUS_DATE_TYPE_TRASHED);
+			if (result == 0) {
+				result = compare_by_full_path (file_1, file_2);
+			}
+			break;
 		case NAUTILUS_FILE_SORT_BY_EMBLEMS:
 			/* GnomeVFS doesn't know squat about our emblems, so
 			 * we handle comparing them here, before falling back
@@ -3206,6 +3231,11 @@
 						       NAUTILUS_FILE_SORT_BY_ATIME,
 						       directories_first,
 						       reversed);
+        } else if (attribute == attribute_deletion_date_q) {
+		return nautilus_file_compare_for_sort (file_1, file_2,
+						       NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
+						       directories_first,
+						       reversed);
 	} else if (attribute == attribute_emblems_q) {
 		return nautilus_file_compare_for_sort (file_1, file_2,
 						       NAUTILUS_FILE_SORT_BY_EMBLEMS,
@@ -4266,6 +4296,7 @@
 	g_return_val_if_fail (date_type == NAUTILUS_DATE_TYPE_CHANGED
 			      || date_type == NAUTILUS_DATE_TYPE_ACCESSED
 			      || date_type == NAUTILUS_DATE_TYPE_MODIFIED
+			      || date_type == NAUTILUS_DATE_TYPE_TRASHED
 			      || date_type == NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED, FALSE);
 
 	if (file == NULL) {
@@ -4505,6 +4536,16 @@
 		width, measure_callback, truncate_callback, measure_context);
 }
 
+static char *
+nautilus_file_get_trash_original_file_as_string (NautilusFile *file)
+{
+	if (file->details->trash_orig_path != NULL) {
+		return g_uri_unescape_string (file->details->trash_orig_path, "");
+	}
+
+	return NULL;
+}
+
 /**
  * nautilus_file_get_date_as_string:
  * 
@@ -5934,7 +5975,7 @@
  * set includes "name", "type", "mime_type", "size", "deep_size", "deep_directory_count",
  * "deep_file_count", "deep_total_count", "date_modified", "date_changed", "date_accessed", 
  * "date_permissions", "owner", "group", "permissions", "octal_permissions", "uri", "where",
- * "link_target", "volume", "free_space", "selinux_context"
+ * "link_target", "volume", "free_space", "selinux_context", "deletion_date", "trashed_orig_path"
  * 
  * Returns: Newly allocated string ready to display to the user, or NULL
  * if the value is unknown or @attribute_name is not supported.
@@ -5972,6 +6013,9 @@
 	if (attribute_q == attribute_deep_total_count_q) {
 		return nautilus_file_get_deep_total_count_as_string (file);
 	}
+	if (attribute_q == attribute_deletion_orig_path_q) {
+		return nautilus_file_get_trash_original_file_as_string (file);
+	}
 	if (attribute_q == attribute_date_modified_q) {
 		return nautilus_file_get_date_as_string (file, 
 							 NAUTILUS_DATE_TYPE_MODIFIED);
@@ -5984,6 +6028,10 @@
 		return nautilus_file_get_date_as_string (file,
 							 NAUTILUS_DATE_TYPE_ACCESSED);
 	}
+	if (attribute_q == attribute_deletion_date_q) {
+		return nautilus_file_get_date_as_string (file,
+							 NAUTILUS_DATE_TYPE_TRASHED);
+	}
 	if (attribute_q == attribute_date_permissions_q) {
 		return nautilus_file_get_date_as_string (file,
 							 NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED);
@@ -6109,6 +6157,14 @@
 	if (attribute_q == attribute_mime_type_q) {
 		return g_strdup (_("unknown MIME type"));
 	}
+	if (attribute_q == attribute_deletion_date_q) {
+		/* If n/a */
+		return g_strdup ("");
+	}
+	if (attribute_q == attribute_deletion_orig_path_q) {
+		/* If n/a */
+		return g_strdup ("");
+	}
 	
 	/* Fallback, use for both unknown attributes and attributes
 	 * for which we have no more appropriate default.
@@ -6130,6 +6186,7 @@
 	    attribute_q == attribute_accessed_date_q ||
 	    attribute_q == attribute_date_accessed_q ||
 	    attribute_q == attribute_date_changed_q ||
+	    attribute_q == attribute_deletion_date_q ||
 	    attribute_q == attribute_date_permissions_q) {
 		return TRUE;
 	}
@@ -7838,6 +7895,8 @@
 	attribute_deep_directory_count_q = g_quark_from_static_string ("deep_directory_count");
 	attribute_deep_total_count_q = g_quark_from_static_string ("deep_total_count");
 	attribute_date_changed_q = g_quark_from_static_string ("date_changed");
+	attribute_deletion_date_q = g_quark_from_static_string ("deletion_date");
+	attribute_deletion_orig_path_q = g_quark_from_static_string ("trashed_orig_path");
 	attribute_date_permissions_q = g_quark_from_static_string ("date_permissions");
 	attribute_permissions_q = g_quark_from_static_string ("permissions");
 	attribute_selinux_context_q = g_quark_from_static_string ("selinux_context");
--- orig/nautilus-2.27.92/libnautilus-private/nautilus-file.h	2009-07-14 13:08:11.000000000 +0200
+++ nautilus-2.27.92/libnautilus-private/nautilus-file.h	2009-09-14 18:39:36.000000000 +0200
@@ -61,7 +61,8 @@
 	NAUTILUS_FILE_SORT_BY_TYPE,
 	NAUTILUS_FILE_SORT_BY_MTIME,
         NAUTILUS_FILE_SORT_BY_ATIME,
-	NAUTILUS_FILE_SORT_BY_EMBLEMS
+	NAUTILUS_FILE_SORT_BY_EMBLEMS,
+	NAUTILUS_FILE_SORT_BY_TRASHED_TIME
 } NautilusFileSortType;	
 
 typedef enum {
@@ -483,7 +484,8 @@
 	NAUTILUS_DATE_TYPE_MODIFIED,
 	NAUTILUS_DATE_TYPE_CHANGED,
 	NAUTILUS_DATE_TYPE_ACCESSED,
-	NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED
+	NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED,
+	NAUTILUS_DATE_TYPE_TRASHED
 } NautilusDateType;
 
 typedef struct {
--- orig/nautilus-2.27.92/libnautilus-private/nautilus-file-private.h	2009-07-14 13:08:11.000000000 +0200
+++ nautilus-2.27.92/libnautilus-private/nautilus-file-private.h	2009-09-13 23:30:25.000000000 +0200
@@ -40,7 +40,7 @@
 #define NAUTILUS_FILE_TOP_LEFT_TEXT_MAXIMUM_BYTES               1024
 
 #define NAUTILUS_FILE_DEFAULT_ATTRIBUTES				\
-	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path,metadata::*"
+	"standard::*,access::*,mountable::*,time::*,unix::*,owner::*,selinux::*,thumbnail::*,id::filesystem,trash::orig-path,trash::deletion-date,metadata::*"
 
 /* These are in the typical sort order. Known things come first, then
  * things where we can't know, finally things where we don't yet know.
@@ -226,6 +226,8 @@
 	eel_boolean_bit filesystem_readonly           : 1;
 	eel_boolean_bit filesystem_use_preview        : 2; /* GFilesystemPreviewType */
 	eel_boolean_bit filesystem_info_is_up_to_date : 1;
+
+	time_t trash_time; /* 0 is unknown */
 };
 
 typedef struct {
--- orig/nautilus-2.27.92/libnautilus-private/nautilus-vfs-file.c	2009-07-14 13:08:11.000000000 +0200
+++ nautilus-2.27.92/libnautilus-private/nautilus-vfs-file.c	2009-09-13 23:30:17.000000000 +0200
@@ -312,6 +312,15 @@
 			*date = file->details->mtime;
 		}
 		return TRUE;
+	case NAUTILUS_DATE_TYPE_TRASHED:
+		/* Before we have info on a file, the date is unknown. */
+		if (file->details->trash_time == 0) {
+			return FALSE;
+		}
+		if (date != NULL) {
+			*date = file->details->trash_time;
+		}
+		return TRUE;
 	case NAUTILUS_DATE_TYPE_PERMISSIONS_CHANGED:
 		/* Before we have info on a file, the date is unknown. */
 		if (file->details->mtime == 0 || file->details->ctime == 0) {
