diff --git a/src/nautilus-icon-view.c b/src/nautilus-icon-view.c
index cad581e..8008bc6 100644
--- a/src/nautilus-icon-view.c
+++ b/src/nautilus-icon-view.c
@@ -57,6 +57,7 @@
 #include <libnautilus-private/nautilus-link.h>
 #include <libnautilus-private/nautilus-metadata.h>
 #include <libnautilus-private/nautilus-clipboard.h>
+#include <libnautilus-private/nautilus-desktop-directory.h>
 #include <libnautilus-private/nautilus-desktop-icon-file.h>
 #include <locale.h>
 #include <signal.h>
@@ -1355,6 +1356,27 @@ nautilus_icon_view_is_empty (NautilusView *view)
 		(get_icon_container (NAUTILUS_ICON_VIEW (view)));
 }
 
+static char *
+nautilus_icon_view_get_backing_uri (NautilusView *view)
+{
+	NautilusDirectory *directory;
+	char *uri;
+
+	g_return_val_if_fail (NAUTILUS_IS_ICON_VIEW (view), NULL);
+
+	directory = nautilus_view_get_model (view);
+	if (NAUTILUS_IS_DESKTOP_DIRECTORY (directory)) {
+		directory = nautilus_desktop_directory_get_real_directory (NAUTILUS_DESKTOP_DIRECTORY (directory));
+	} else {
+		nautilus_directory_ref (directory);
+	}
+
+	uri = nautilus_directory_get_uri (directory);
+	nautilus_directory_unref (directory);
+
+	return uri;
+}
+
 static GList *
 nautilus_icon_view_get_selection (NautilusView *view)
 {
@@ -2929,6 +2951,7 @@ nautilus_icon_view_class_init (NautilusIconViewClass *klass)
 	nautilus_view_class->clear = nautilus_icon_view_clear;
 	nautilus_view_class->end_loading = nautilus_icon_view_end_loading;
 	nautilus_view_class->file_changed = nautilus_icon_view_file_changed;
+	nautilus_view_class->get_backing_uri = nautilus_icon_view_get_backing_uri;
 	nautilus_view_class->get_selected_icon_locations = nautilus_icon_view_get_selected_icon_locations;
 	nautilus_view_class->get_selection = nautilus_icon_view_get_selection;
 	nautilus_view_class->get_selection_for_file_transfer = nautilus_icon_view_get_selection;
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 6e43230..f8fa558 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -59,6 +59,7 @@
 #include <libnautilus-private/nautilus-tree-view-drag-dest.h>
 #include <libnautilus-private/nautilus-clipboard.h>
 #include <libnautilus-private/nautilus-cell-renderer-text-ellipsized.h>
+#include <libnautilus-private/nautilus-desktop-directory.h>
 
 #define DEBUG_FLAG NAUTILUS_DEBUG_LIST_VIEW
 #include <libnautilus-private/nautilus-debug.h>
@@ -1131,6 +1132,8 @@ sort_column_changed_callback (GtkTreeSortable *sortable,
 	char *reversed_attr, *default_reversed_attr;
 	gboolean default_sort_reversed;
 
+	printf ("%s: called\n", __func__);
+
 	file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (view));
 
 	gtk_tree_sortable_get_sort_column_id (sortable, &sort_column_id, &reversed);
@@ -2001,6 +2004,52 @@ nautilus_list_view_file_changed (NautilusView *view, NautilusFile *file, Nautilu
 	}
 }
 
+static char *
+nautilus_list_view_get_backing_uri (NautilusView *view)
+{
+	NautilusListView *list_view;
+	NautilusDirectory *directory;
+	GList *list;
+	char *uri;
+
+	/* XXX handle renaming of the current selection? */
+
+	g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL);
+
+	list_view = NAUTILUS_LIST_VIEW (view);
+
+	/* If exactly one object is selected, and it is a directory,
+	 * return its URI */
+
+	directory = NULL;
+	if (tree_view_has_selection (list_view->details->tree_view)) {
+		list = nautilus_list_view_get_selection (view);
+		if (g_list_length (list) == 1) {
+			NautilusFile *file;
+			file = NAUTILUS_FILE (list->data);
+			if (nautilus_file_is_directory (file)) {
+				directory = nautilus_directory_get_for_file (file);
+			}
+		}
+		nautilus_file_list_free (list);
+	}
+
+	if (directory == NULL) {
+		directory = nautilus_view_get_model (view);
+	}
+
+	if (NAUTILUS_IS_DESKTOP_DIRECTORY (directory)) {
+		directory = nautilus_desktop_directory_get_real_directory (NAUTILUS_DESKTOP_DIRECTORY (directory));
+	} else {
+		nautilus_directory_ref (directory);
+	}
+
+	uri = nautilus_directory_get_uri (directory);
+	nautilus_directory_unref (directory);
+
+	return uri;
+}
+
 static void
 nautilus_list_view_get_selection_foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
 {
@@ -3076,6 +3125,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class)
         nautilus_view_class->click_policy_changed = nautilus_list_view_click_policy_changed;
 	nautilus_view_class->clear = nautilus_list_view_clear;
 	nautilus_view_class->file_changed = nautilus_list_view_file_changed;
+	nautilus_view_class->get_backing_uri = nautilus_list_view_get_backing_uri;
 	nautilus_view_class->get_selection = nautilus_list_view_get_selection;
 	nautilus_view_class->get_selection_for_file_transfer = nautilus_list_view_get_selection_for_file_transfer;
 	nautilus_view_class->get_item_count = nautilus_list_view_get_item_count;
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index f6b9719..a9e8a55 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -317,6 +317,7 @@ EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, can_zoom_in)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, can_zoom_out)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, clear)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, file_changed)
+EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, get_backing_uri)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, get_selection)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, get_selection_for_file_transfer)
 EEL_IMPLEMENT_MUST_OVERRIDE_SIGNAL (nautilus_view, get_item_count)
@@ -358,6 +359,24 @@ nautilus_view_unmerge_menus (NautilusView *view)
 }
 
 /**
+ *
+ * nautilus_view_get_backing_uri:
+ *
+ * Returns the URI for the target location of new directory, new file, new
+ * link, new launcher, and paste operations.
+ */
+
+char *
+nautilus_view_get_backing_uri (NautilusView *view)
+{
+	g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+
+	return EEL_CALL_METHOD_WITH_RETURN_VALUE
+		(NAUTILUS_VIEW_CLASS, view,
+		 get_backing_uri, (view));
+}
+
+/**
  * nautilus_view_select_all:
  *
  * select all the items in the view
@@ -1293,34 +1312,6 @@ action_other_application_callback (GtkAction *action,
 	open_with_other_program (NAUTILUS_VIEW (callback_data));
 }
 
-/* Get the real directory where files will be stored and created */
-char *
-nautilus_view_get_backing_uri (NautilusView *view)
-{
-	NautilusDirectory *directory;
-	char *uri;
-	
-	g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
-
-	if (view->details->model == NULL) {
-		return NULL;
-	}
-	
-	directory = view->details->model;
-	
-	if (NAUTILUS_IS_DESKTOP_DIRECTORY (directory)) {
-		directory = nautilus_desktop_directory_get_real_directory (NAUTILUS_DESKTOP_DIRECTORY (directory));
-	} else {
-		nautilus_directory_ref (directory);
-	}
-	
-	uri = nautilus_directory_get_uri (directory);
-
-	nautilus_directory_unref (directory);
-
-	return uri;
-}
-
 static void
 trash_or_delete_selected_files (NautilusView *view)
 {
@@ -9775,6 +9766,7 @@ nautilus_view_class_init (NautilusViewClass *klass)
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, can_zoom_out);
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, clear);
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, file_changed);
+	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, get_backing_uri);
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, get_selection);
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, get_selection_for_file_transfer);
 	EEL_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, nautilus_view, get_item_count);
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 5d94a72..eb079ac 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -142,6 +142,14 @@ struct NautilusViewClass {
          */
         void     (* reset_to_defaults)	         (NautilusView *view);
 
+	/* get_backing uri is a function pointer for subclasses to
+	 * override. Subclasses must replace it with a function that
+	 * returns the URI for the location where to create new folders,
+	 * files, links, launchers, and paste the clipboard to.
+	 */
+
+	char *	(* get_backing_uri)		(NautilusView *view);
+
 	/* get_selection is not a signal; it is just a function pointer for
 	 * subclasses to replace (override). Subclasses must replace it
 	 * with a function that returns a newly-allocated GList of
